linq
Standardowe operatory zapytań
Szukaj…
Uwagi
Zapytania Linq są pisane przy użyciu Standardowych operatorów zapytania (które są zestawem metod rozszerzenia, które działają głównie na obiektach typu IEnumerable<T>
i IQueryable<T>
) lub przy użyciu wyrażeń zapytania (które w czasie kompilacji są konwertowane na Standardowy operator zapytania wywołania metod).
Operatory zapytań zapewniają funkcje zapytań, w tym filtrowanie, projekcję, agregację, sortowanie i inne.
Operacje konkatenacji
Łączenie odnosi się do operacji dołączania jednej sekwencji do drugiej.
Concat
Łączy dwie sekwencje, tworząc jedną sekwencję.
Metoda Składnia
// Concat
var numbers1 = new int[] { 1, 2, 3 };
var numbers2 = new int[] { 4, 5, 6 };
var numbers = numbers1.Concat(numbers2);
// numbers = { 1, 2, 3, 4, 5, 6 }
Składnia zapytania
// Not applicable.
Filtrowanie operacji
Filtrowanie odnosi się do operacji ograniczania zestawu wyników, aby zawierał tylko te elementy, które spełniają określony warunek.
Gdzie
Wybiera wartości oparte na funkcji predykatu.
Metoda Składnia
// Where
var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var evens = numbers.Where(n => n % 2 == 0);
// evens = { 2, 4, 6, 8 }
Składnia zapytania
// where
var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var odds = from n in numbers
where n % 2 != 0
select n;
// odds = { 1, 3, 5, 7 }
OfType
Wybiera wartości, w zależności od ich zdolności do rzutowania na określony typ.
Metoda Składnia
// OfType
var numbers = new object[] { 1, "one", 2, "two", 3, "three" };
var strings = numbers.OfType<string>();
// strings = { "one", "two", "three" }
Składnia zapytania
// Not applicable.
Dołącz do operacji
Połączenie dwóch źródeł danych polega na powiązaniu obiektów w jednym źródle danych z obiektami, które mają wspólny atrybut w innym źródle danych.
Przystąp
Łączy dwie sekwencje w oparciu o funkcje selektora klawiszy i wyodrębnia pary wartości.
Metoda Składnia
// Join
class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
class Order
{
public string Description { get; set; }
public int CustomerId { get; set; }
}
...
var customers = new Customer[]
{
new Customer { Id = 1, Name = "C1" },
new Customer { Id = 2, Name = "C2" },
new Customer { Id = 3, Name = "C3" }
};
var orders = new Order[]
{
new Order { Description = "O1", CustomerId = 1 },
new Order { Description = "O2", CustomerId = 1 },
new Order { Description = "O3", CustomerId = 2 },
new Order { Description = "O4", CustomerId = 3 },
};
var join = customers.Join(orders, c => c.Id, o => o.CustomerId, (c, o) => c.Name + "-" + o.Description);
// join = { "C1-O1", "C1-O2", "C2-O3", "C3-O4" }
Składnia zapytania
// join … in … on … equals …
var join = from c in customers
join o in orders
on c.Id equals o.CustomerId
select o.Description + "-" + c.Name;
// join = { "O1-C1", "O2-C1", "O3-C2", "O4-C3" }
GroupJoin
Łączy dwie sekwencje w oparciu o funkcje selektora klawiszy i grupuje wynikowe dopasowania dla każdego elementu.
Metoda Składnia
// GroupJoin
var groupJoin = customers.GroupJoin(orders,
c => c.Id,
o => o.CustomerId,
(c, ors) => c.Name + "-" + string.Join(",", ors.Select(o => o.Description)));
// groupJoin = { "C1-O1,O2", "C2-O3", "C3-O4" }
Składnia zapytania
// join … in … on … equals … into …
var groupJoin = from c in customers
join o in orders
on c.Id equals o.CustomerId
into customerOrders
select string.Join(",", customerOrders.Select(o => o.Description)) + "-" + c.Name;
// groupJoin = { "O1,O2-C1", "O3-C2", "O4-C3" }
Zamek błyskawiczny
Stosuje określoną funkcję do odpowiednich elementów dwóch sekwencji, tworząc sekwencję wyników.
var numbers = new [] { 1, 2, 3, 4, 5, 6 };
var words = new [] { "one", "two", "three" };
var numbersWithWords =
numbers
.Zip(
words,
(number, word) => new { number, word });
// Results
//| number | word |
//| ------ | ------ |
//| 1 | one |
//| 2 | two |
//| 3 | three |
Operacje projekcyjne
Projekcja odnosi się do operacji przekształcania obiektu w nową formę.
Wybierz
Projektuje wartości oparte na funkcji transformacji.
Metoda Składnia
// Select
var numbers = new int[] { 1, 2, 3, 4, 5 };
var strings = numbers.Select(n => n.ToString());
// strings = { "1", "2", "3", "4", "5" }
Składnia zapytania
// select
var numbers = new int[] { 1, 2, 3, 4, 5 };
var strings = from n in numbers
select n.ToString();
// strings = { "1", "2", "3", "4", "5" }
Wybierz wiele
Projektuje sekwencje wartości oparte na funkcji transformacji, a następnie spłaszcza je w jedną sekwencję.
Metoda Składnia
// SelectMany
class Customer
{
public Order[] Orders { get; set; }
}
class Order
{
public Order(string desc) { Description = desc; }
public string Description { get; set; }
}
...
var customers = new Customer[]
{
new Customer { Orders = new Order[] { new Order("O1"), new Order("O2") } },
new Customer { Orders = new Order[] { new Order("O3") } },
new Customer { Orders = new Order[] { new Order("O4") } },
};
var orders = customers.SelectMany(c => c.Orders);
// orders = { Order("O1"), Order("O3"), Order("O3"), Order("O4") }
Składnia zapytania
// multiples from
var orders = from c in customers
from o in c.Orders
select o;
// orders = { Order("O1"), Order("O3"), Order("O3"), Order("O4") }
Operacje sortowania
Operacja sortowania porządkuje elementy sekwencji na podstawie jednego lub więcej atrybutów.
Zamów przez
Sortuje wartości w porządku rosnącym.
Metoda Składnia
// OrderBy
var numbers = new int[] { 5, 4, 8, 2, 7, 1, 9, 3, 6 };
var ordered = numbers.OrderBy(n => n);
// ordered = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
Składnia zapytania
// orderby
var numbers = new int[] { 5, 4, 8, 2, 7, 1, 9, 3, 6 };
var ordered = from n in numbers
orderby n
select n;
// ordered = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
OrderByDescending
Sortuje wartości w kolejności malejącej.
Metoda Składnia
// OrderByDescending
var numbers = new int[] { 5, 4, 8, 2, 7, 1, 9, 3, 6 };
var ordered = numbers.OrderByDescending(n => n);
// ordered = { 9, 8, 7, 6, 5, 4, 3, 2, 1 }
Składnia zapytania
// orderby
var numbers = new int[] { 5, 4, 8, 2, 7, 1, 9, 3, 6 };
var ordered = from n in numbers
orderby n descending
select n;
// ordered = { 9, 8, 7, 6, 5, 4, 3, 2, 1 }
Więc przez
Wykonuje sortowanie wtórne w porządku rosnącym.
Metoda Składnia
// ThenBy
string[] words = { "the", "quick", "brown", "fox", "jumps" };
var ordered = words.OrderBy(w => w.Length).ThenBy(w => w[0]);
// ordered = { "fox", "the", "brown", "jumps", "quick" }
Składnia zapytania
// orderby …, …
string[] words = { "the", "quick", "brown", "fox", "jumps" };
var ordered = from w in words
orderby w.Length, w[0]
select w;
// ordered = { "fox", "the", "brown", "jumps", "quick" }
ThenByDescending
Wykonuje sortowanie wtórne w kolejności malejącej.
Metoda Składnia
// ThenByDescending
string[] words = { "the", "quick", "brown", "fox", "jumps" };
var ordered = words.OrderBy(w => w[0]).ThenByDescending(w => w.Length);
// ordered = { "brown", "fox", "jumps", "quick", "the" }
Składnia zapytania
// orderby …, … descending
string[] words = { "the", "quick", "brown", "fox", "jumps" };
var ordered = from w in words
orderby w.Length, w[0] descending
select w;
// ordered = { "the", "fox", "quick", "jumps", "brown" }
Rewers
Odwraca kolejność elementów w kolekcji.
Metoda Składnia
// Reverse
var numbers = new int[] { 1, 2, 3, 4, 5 };
var reversed = numbers.Reverse();
// reversed = { 5, 4, 3, 2, 1 }
Składnia zapytania
// Not applicable.
Operacje konwersji
Operacje konwersji zmieniają typ obiektów wejściowych.
AsEnumerable
Zwraca dane wejściowe o typie IEnumerable.
Metoda Składnia
// AsEnumerable
int[] numbers = { 1, 2, 3, 4, 5 };
var nums = numbers.AsEnumerable();
// nums: static type is IEnumerable<int>
Składnia zapytania
// Not applicable.
AsQueryable
Konwertuje IEnumerable na IQueryable.
Metoda Składnia
// AsQueryable
int[] numbers = { 1, 2, 3, 4, 5 };
var nums = numbers.AsQueryable();
// nums: static type is IQueryable<int>
Składnia zapytania
// Not applicable.
Odlew
Rzuca elementy kolekcji na określony typ.
Metoda Składnia
// Cast
var numbers = new object[] { 1, 2, 3, 4, 5 };
var nums = numbers.Cast<int>();
// nums: static type is IEnumerable<int>
Składnia zapytania
// Use an explicitly typed range variable.
var numbers = new object[] { 1, 2, 3, 4, 5 };
var nums = from int n in numbers select n;
// nums: static type is IEnumerable<int>
OfType
Filtruje wartości, w zależności od ich zdolności do rzutowania na określony typ.
Metoda Składnia
// OfType
var objects = new object[] { 1, "one", 2, "two", 3, "three" };
var numbers = objects.OfType<int>();
// nums = { 1, 2, 3 }
Składnia zapytania
// Not applicable.
ToArray
Konwertuje kolekcję na tablicę.
Metoda Składnia
// ToArray
var numbers = Enumerable.Range(1, 5);
int[] array = numbers.ToArray();
// array = { 1, 2, 3, 4, 5 }
Składnia zapytania
// Not applicable.
Notować
Konwertuje kolekcję na listę.
Metoda Składnia
// ToList
var numbers = Enumerable.Range(1, 5);
List<int> list = numbers.ToList();
// list = { 1, 2, 3, 4, 5 }
Składnia zapytania
// Not applicable.
ToDictionary
Umieszcza elementy w słowniku na podstawie funkcji selektora klawiszy.
Metoda Składnia
// ToDictionary
var numbers = new int[] { 1, 2, 3 };
var dict = numbers.ToDictionary(n => n.ToString());
// dict = { "1" => 1, "2" => 2, "3" => 3 }
Składnia zapytania
// Not applicable.
Operacje agregacyjne
Operacje agregacji obliczają pojedynczą wartość ze zbioru wartości.
Agregat
Wykonuje niestandardową operację agregacji wartości kolekcji.
Metoda Składnia
// Aggregate
var numbers = new int[] { 1, 2, 3, 4, 5 };
var product = numbers.Aggregate(1, (acc, n) => acc * n);
// product = 120
Składnia zapytania
// Not applicable.
Średni
Oblicza średnią wartość zbioru wartości.
Metoda Składnia
// Average
var numbers = new int[] { 1, 2, 3, 4, 5 };
var average = numbers.Average();
// average = 3
Składnia zapytania
// Not applicable.
Liczyć
Liczy elementy w kolekcji, opcjonalnie tylko te elementy, które spełniają funkcję predykatu.
Metoda Składnia
// Count
var numbers = new int[] { 1, 2, 3, 4, 5 };
int count = numbers.Count(n => n % 2 == 0);
// count = 2
Składnia zapytania
// Not applicable.
LongCount
Liczy elementy w dużej kolekcji, opcjonalnie tylko te elementy, które spełniają funkcję predykatu.
Metoda Składnia
// LongCount
var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
long count = numbers.LongCount();
// count = 10
Składnia zapytania
// Not applicable.
Max
Określa maksymalną wartość w kolekcji. Zgłasza wyjątek, jeśli kolekcja jest pusta.
Metoda Składnia
// Max
var numbers = new int[] { 1, 2, 3, 4, 5 };
var max = numbers.Max();
// max = 5
Składnia zapytania
// Not applicable.
Min
Określa minimalną wartość w kolekcji. Zgłasza wyjątek, jeśli kolekcja jest pusta.
Metoda Składnia
// Min
var numbers = new int[] { 1, 2, 3, 4, 5 };
var min = numbers.Min();
// min = 1
Składnia zapytania
// Not applicable.
Min- / MaxOrDefault
W przeciwieństwie do innych rozszerzeń LinQ
Min()
iMax()
nie mają przeciążenia bez wyjątków. W związku z tymIEnumerable
musi być sprawdzony dlaAny()
przed wywołaniemMin()
lubMax()
// Max
var numbers = new int[] { };
var max = numbers.Any() ? numbers.Max() : 0;
// max = 0
Suma
Oblicza sumę wartości w kolekcji.
Metoda Składnia
// Sum
var numbers = new int[] { 1, 2, 3, 4, 5 };
var sum = numbers.Sum();
// sum = 15
Składnia zapytania
// Not applicable.
Operacje kwantyfikatora
Operacje kwantyfikatora zwracają wartość logiczną, która wskazuje, czy niektóre lub wszystkie elementy w sekwencji spełniają warunek.
Wszystko
Określa, czy wszystkie elementy w sekwencji spełniają warunek.
Metoda Składnia
// All
var numbers = new int[] { 1, 2, 3, 4, 5 };
bool areLessThan10 = numbers.All(n => n < 10);
// areLessThan10 = true
Składnia zapytania
// Not applicable.
Każdy
Określa, czy którykolwiek element w sekwencji spełnia warunek.
Metoda Składnia
// Any
var numbers = new int[] { 1, 2, 3, 4, 5 };
bool anyOneIsEven = numbers.Any(n => n % 2 == 0);
// anyOneIsEven = true
Składnia zapytania
// Not applicable.
Zawiera
Określa, czy sekwencja zawiera określony element.
Metoda Składnia
// Contains
var numbers = new int[] { 1, 2, 3, 4, 5 };
bool appears = numbers.Contains(10);
// appears = false
Składnia zapytania
// Not applicable.
Grupowanie operacji
Grupowanie odnosi się do operacji umieszczania danych w grupach, aby elementy w każdej grupie miały wspólny atrybut.
Grupuj według
Grupuje elementy, które mają wspólny atrybut.
Metoda Składnia
// GroupBy
class Order
{
public string Customer { get; set; }
public string Description { get; set; }
}
...
var orders = new Order[]
{
new Order { Customer = "C1", Description = "O1" },
new Order { Customer = "C2", Description = "O2" },
new Order { Customer = "C3", Description = "O3" },
new Order { Customer = "C1", Description = "O4" },
new Order { Customer = "C1", Description = "O5" },
new Order { Customer = "C3", Description = "O6" },
};
var groups = orders.GroupBy(o => o.Customer);
// groups: { (Key="C1", Values="O1","O4","O5"), (Key="C2", Values="O2"), (Key="C3", Values="O3","O6") }
Składnia zapytania
// group … by
var groups = from o in orders
group o by o.Customer;
// groups: { (Key="C1", Values="O1","O4","O5"), (Key="C2", Values="O2"), (Key="C3", Values="O3","O6") }
ToLookup
Wstawia elementy do słownika jeden do wielu na podstawie funkcji wyboru klucza.
Metoda Składnia
// ToLookUp
var ordersByCustomer = orders.ToLookup(o => o.Customer);
// ordersByCustomer = ILookUp<string, Order>
// {
// "C1" => { Order("01"), Order("04"), Order("05") },
// "C2" => { Order("02") },
// "C3" => { Order("03"), Order("06") }
// }
Składnia zapytania
// Not applicable.
Operacje partycji
Partycjonowanie odnosi się do operacji dzielenia sekwencji wejściowej na dwie sekcje, bez zmiany kolejności elementów, a następnie zwracania jednej z sekcji.
Pominąć
Pomija elementy do określonej pozycji w sekwencji.
Metoda Składnia
// Skip
var numbers = new int[] { 1, 2, 3, 4, 5 };
var skipped = numbers.Skip(3);
// skipped = { 4, 5 }
Składnia zapytania
// Not applicable.
SkipWhile
Pomija elementy oparte na funkcji predykatu, dopóki element nie spełni warunku.
Metoda Składnia
// Skip
var numbers = new int[] { 1, 3, 5, 2, 1, 3, 5 };
var skipLeadingOdds = numbers.SkipWhile(n => n % 2 != 0);
// skipLeadingOdds = { 2, 1, 3, 5 }
Składnia zapytania
// Not applicable.
Brać
Podnosi elementy do określonej pozycji w sekwencji.
Metoda Składnia
// Take
var numbers = new int[] { 1, 2, 3, 4, 5 };
var taken = numbers.Take(3);
// taken = { 1, 2, 3 }
Składnia zapytania
// Not applicable.
TakeWhile
Pobiera elementy oparte na funkcji predykatu, dopóki element nie spełni warunku.
Metoda Składnia
// TakeWhile
var numbers = new int[] { 1, 3, 5, 2, 1, 3, 5 };
var takeLeadingOdds = numbers.TakeWhile(n => n % 2 != 0);
// takeLeadingOdds = { 1, 3, 5 }
Składnia zapytania
// Not applicable.
Operacje generacji
Generowanie odnosi się do tworzenia nowej sekwencji wartości.
DefaultIfEmpty
Zastępuje pustą kolekcję kolekcją singletonów o wartości domyślnej.
Metoda Składnia
// DefaultIfEmpty
var nums = new int[0];
var numbers = nums.DefaultIfEmpty();
// numbers = { 0 }
Składnia zapytania
// Not applicable.
Pusty
Zwraca pustą kolekcję.
Metoda Składnia
// Empty
var empty = Enumerable.Empty<string>();
// empty = IEnumerable<string> { }
Składnia zapytania
// Not applicable.
Zasięg
Generuje kolekcję zawierającą sekwencję liczb.
Metoda Składnia
// Range
var range = Enumerable.Range(1, 5);
// range = { 1, 2, 3, 4, 5 }
Składnia zapytania
// Not applicable.
Powtarzać
Generuje kolekcję, która zawiera jedną powtarzaną wartość.
Metoda Składnia
// Repeat
var repeats = Enumerable.Repeat("s", 3);
// repeats = { "s", "s", "s" }
Składnia zapytania
// Not applicable.
Ustaw operacje
Operacje ustawiania odnoszą się do zapytań, które dają zestaw wyników oparty na obecności lub braku równoważnych elementów w tych samych lub osobnych kolekcjach (lub zestawach).
Odrębny
Usuwa zduplikowane wartości z kolekcji.
Metoda Składnia
// Distinct
var numbers = new int[] { 1, 2, 3, 1, 2, 3 };
var distinct = numbers.Distinct();
// distinct = { 1, 2, 3 }
Składnia zapytania
// Not applicable.
Z wyjątkiem
Zwraca ustawioną różnicę, co oznacza elementy jednej kolekcji, które nie pojawiają się w drugiej kolekcji.
Metoda Składnia
// Except
var numbers1 = new int[] { 1, 2, 3, 4, 5 };
var numbers2 = new int[] { 4, 5, 6, 7, 8 };
var except = numbers1.Except(numbers2);
// except = { 1, 2, 3 }
Składnia zapytania
// Not applicable.
Krzyżować
Zwraca ustawione skrzyżowanie, co oznacza elementy występujące w każdej z dwóch kolekcji.
Metoda Składnia
// Intersect
var numbers1 = new int[] { 1, 2, 3, 4, 5 };
var numbers2 = new int[] { 4, 5, 6, 7, 8 };
var intersect = numbers1.Intersect(numbers2);
// intersect = { 4, 5 }
Składnia zapytania
// Not applicable.
Unia
Zwraca zestaw unii, co oznacza unikalne elementy, które pojawiają się w jednej z dwóch kolekcji.
Metoda Składnia
// Union
var numbers1 = new int[] { 1, 2, 3, 4, 5 };
var numbers2 = new int[] { 4, 5, 6, 7, 8 };
var union = numbers1.Union(numbers2);
// union = { 1, 2, 3, 4, 5, 6, 7, 8 }
Składnia zapytania
// Not applicable.
Operacje na rzecz równości
Dwie sekwencje, których odpowiadające elementy są równe i które mają taką samą liczbę elementów, uważa się za równe.
SequenceEqual
Określa, czy dwie sekwencje są równe, porównując elementy w parach.
Metoda Składnia
// SequenceEqual
var numbers1 = new int[] { 1, 2, 3, 4, 5 };
var numbers2 = new int[] { 1, 2, 3, 4, 5 };
var equals = numbers1.SequenceEqual(numbers2);
// equals = true
Składnia zapytania
// Not Applicable.
Operacje na elementach
Operacje na elementach zwracają pojedynczy, określony element z sekwencji.
ElementAt
Zwraca element o określonym indeksie w kolekcji.
Metoda Składnia
// ElementAt
var strings = new string[] { "zero", "one", "two", "three" };
var str = strings.ElementAt(2);
// str = "two"
Składnia zapytania
// Not Applicable.
ElementAtOrDefault
Zwraca element pod określonym indeksem w kolekcji lub wartością domyślną, jeśli indeks jest poza zakresem.
Metoda Składnia
// ElementAtOrDefault
var strings = new string[] { "zero", "one", "two", "three" };
var str = strings.ElementAtOrDefault(10);
// str = null
Składnia zapytania
// Not Applicable.
Pierwszy
Zwraca pierwszy element kolekcji lub pierwszy element spełniający warunek.
Metoda Składnia
// First
var numbers = new int[] { 1, 2, 3, 4, 5 };
var first = strings.First();
// first = 1
Składnia zapytania
// Not Applicable.
FirstOrDefault
Zwraca pierwszy element kolekcji lub pierwszy element spełniający warunek. Zwraca wartość domyślną, jeśli taki element nie istnieje.
Metoda Składnia
// FirstOrDefault
var numbers = new int[] { 1, 2, 3, 4, 5 };
var firstGreaterThanTen = strings.FirstOrDefault(n => n > 10);
// firstGreaterThanTen = 0
Składnia zapytania
// Not Applicable.
Ostatni, ubiegły, zeszły
Zwraca ostatni element kolekcji lub ostatni element spełniający warunek.
Metoda Składnia
// Last
var numbers = new int[] { 1, 2, 3, 4, 5 };
var last = strings.Last();
// last = 5
Składnia zapytania
// Not Applicable.
LastOrDefault
Zwraca ostatni element kolekcji lub ostatni element spełniający warunek. Zwraca wartość domyślną, jeśli taki element nie istnieje.
Metoda Składnia
// LastOrDefault
var numbers = new int[] { 1, 2, 3, 4, 5 };
var lastGreaterThanTen = strings.LastOrDefault(n => n > 10);
// lastGreaterThanTen = 0
Składnia zapytania
// Not Applicable.
Pojedynczy
Zwraca jedyny element kolekcji lub jedyny element spełniający warunek.
Metoda Składnia
// Single
var numbers = new int[] { 1 };
var single = strings.Single();
// single = 1
Składnia zapytania
// Not Applicable.
SingleOrDefault
Zwraca jedyny element kolekcji lub jedyny element spełniający warunek. Zwraca wartość domyślną, jeśli taki element nie istnieje lub kolekcja nie zawiera dokładnie jednego elementu.
Metoda Składnia
// SingleOrDefault
var numbers = new int[] { 1, 2, 3, 4, 5 };
var singleGreaterThanFour = strings.SingleOrDefault(n => n > 4);
// singleGreaterThanFour = 5
Składnia zapytania
// Not Applicable.