linq
Стандартные операторы запросов
Поиск…
замечания
Запросы Linq записываются с использованием стандартных операторов запросов (которые представляют собой набор методов расширения, который работает главным образом на объектах типа IEnumerable<T>
и IQueryable<T>
), или с использованием выражений Query Expressions (которые во время компиляции преобразуются в стандартный оператор запроса вызовы методов).
Операторы запросов предоставляют возможности запроса, включая фильтрацию, прогнозирование, агрегацию, сортировку и многое другое.
Операции конкатенации
Конкатенация относится к операции добавления одной последовательности в другую.
Concat
Конкатенация двух последовательностей для формирования одной последовательности.
Синтаксис метода
// 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 }
Синтаксис запроса
// Not applicable.
Операции фильтрации
Фильтрация относится к операциям ограничения набора результатов, содержащего только те элементы, которые удовлетворяют заданному условию.
куда
Выбирает значения, основанные на функции предиката.
Синтаксис метода
// 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 }
Синтаксис запроса
// 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
Выбирает значения, в зависимости от их способности быть нажатыми для указанного типа.
Синтаксис метода
// OfType
var numbers = new object[] { 1, "one", 2, "two", 3, "three" };
var strings = numbers.OfType<string>();
// strings = { "one", "two", "three" }
Синтаксис запроса
// Not applicable.
Присоединиться к
Соединение двух источников данных - это объединение объектов в один источник данных с объектами, которые имеют общий атрибут в другом источнике данных.
Присоединиться
Объединение двух последовательностей основано на функциях выбора ключа и извлекает пары значений.
Синтаксис метода
// 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" }
Синтаксис запроса
// 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
Объединение двух последовательностей на основе функций селектора ключей и группирует итоговые совпадения для каждого элемента.
Синтаксис метода
// 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" }
Синтаксис запроса
// 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" }
застежка - молния
Применяет указанную функцию к соответствующим элементам двух последовательностей, создавая последовательность результатов.
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 |
Проекционные операции
Проекция относится к операциям преобразования объекта в новую форму.
Выбрать
Значения проектов, основанные на функции преобразования.
Синтаксис метода
// Select
var numbers = new int[] { 1, 2, 3, 4, 5 };
var strings = numbers.Select(n => n.ToString());
// strings = { "1", "2", "3", "4", "5" }
Синтаксис запроса
// 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" }
SelectMany
Проекты последовательностей значений, которые основаны на функции преобразования, а затем сглаживают их в одну последовательность.
Синтаксис метода
// 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") }
Синтаксис запроса
// multiples from
var orders = from c in customers
from o in c.Orders
select o;
// orders = { Order("O1"), Order("O3"), Order("O3"), Order("O4") }
Операции сортировки
Операция сортировки упорядочивает элементы последовательности, основанные на одном или нескольких атрибутах.
Сортировать по
Сортирует значения в порядке возрастания.
Синтаксис метода
// 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 }
Синтаксис запроса
// 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
Сортирует значения в порядке убывания.
Синтаксис метода
// 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 }
Синтаксис запроса
// 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 }
ThenBy
Выполняет вторичный сортировку в порядке возрастания.
Синтаксис метода
// 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" }
Синтаксис запроса
// 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
Выполняет вторичный сортировку в порядке убывания.
Синтаксис метода
// 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" }
Синтаксис запроса
// 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" }
Задний ход
Изменяет порядок элементов в коллекции.
Синтаксис метода
// Reverse
var numbers = new int[] { 1, 2, 3, 4, 5 };
var reversed = numbers.Reverse();
// reversed = { 5, 4, 3, 2, 1 }
Синтаксис запроса
// Not applicable.
Операции конверсии
Операции преобразования изменяют тип входных объектов.
AsEnumerable
Возвращает ввод, введенный как IEnumerable.
Синтаксис метода
// AsEnumerable
int[] numbers = { 1, 2, 3, 4, 5 };
var nums = numbers.AsEnumerable();
// nums: static type is IEnumerable<int>
Синтаксис запроса
// Not applicable.
AsQueryable
Преобразует IEnumerable в IQueryable.
Синтаксис метода
// AsQueryable
int[] numbers = { 1, 2, 3, 4, 5 };
var nums = numbers.AsQueryable();
// nums: static type is IQueryable<int>
Синтаксис запроса
// Not applicable.
В ролях
Переводит элементы коллекции в заданный тип.
Синтаксис метода
// Cast
var numbers = new object[] { 1, 2, 3, 4, 5 };
var nums = numbers.Cast<int>();
// nums: static type is IEnumerable<int>
Синтаксис запроса
// 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
Значения фильтров, в зависимости от их способности быть отлиты к указанному типу.
Синтаксис метода
// OfType
var objects = new object[] { 1, "one", 2, "two", 3, "three" };
var numbers = objects.OfType<int>();
// nums = { 1, 2, 3 }
Синтаксис запроса
// Not applicable.
ToArray
Преобразует коллекцию в массив.
Синтаксис метода
// ToArray
var numbers = Enumerable.Range(1, 5);
int[] array = numbers.ToArray();
// array = { 1, 2, 3, 4, 5 }
Синтаксис запроса
// Not applicable.
К списку
Преобразует коллекцию в список.
Синтаксис метода
// ToList
var numbers = Enumerable.Range(1, 5);
List<int> list = numbers.ToList();
// list = { 1, 2, 3, 4, 5 }
Синтаксис запроса
// Not applicable.
ToDictionary
Вставляет элементы в словарь на основе функции выбора ключа.
Синтаксис метода
// ToDictionary
var numbers = new int[] { 1, 2, 3 };
var dict = numbers.ToDictionary(n => n.ToString());
// dict = { "1" => 1, "2" => 2, "3" => 3 }
Синтаксис запроса
// Not applicable.
Агрегирование
Операции агрегирования вычисляют одно значение из набора значений.
заполнитель
Выполняет настраиваемую операцию агрегации по значениям коллекции.
Синтаксис метода
// Aggregate
var numbers = new int[] { 1, 2, 3, 4, 5 };
var product = numbers.Aggregate(1, (acc, n) => acc * n);
// product = 120
Синтаксис запроса
// Not applicable.
Средний
Вычисляет среднее значение набора значений.
Синтаксис метода
// Average
var numbers = new int[] { 1, 2, 3, 4, 5 };
var average = numbers.Average();
// average = 3
Синтаксис запроса
// Not applicable.
подсчитывать
Подсчитывает элементы в коллекции, необязательно только те элементы, которые удовлетворяют предикатной функции.
Синтаксис метода
// Count
var numbers = new int[] { 1, 2, 3, 4, 5 };
int count = numbers.Count(n => n % 2 == 0);
// count = 2
Синтаксис запроса
// Not applicable.
LongCount
Подсчитывает элементы в большой коллекции, необязательно только те элементы, которые удовлетворяют предикатной функции.
Синтаксис метода
// LongCount
var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
long count = numbers.LongCount();
// count = 10
Синтаксис запроса
// Not applicable.
Максимум
Определяет максимальное значение в коллекции. Выдает исключение, если коллекция пуста.
Синтаксис метода
// Max
var numbers = new int[] { 1, 2, 3, 4, 5 };
var max = numbers.Max();
// max = 5
Синтаксис запроса
// Not applicable.
Min
Определяет минимальное значение в коллекции. Выдает исключение, если коллекция пуста.
Синтаксис метода
// Min
var numbers = new int[] { 1, 2, 3, 4, 5 };
var min = numbers.Min();
// min = 1
Синтаксис запроса
// Not applicable.
Мин- / MaxOrDefault
В отличие от других расширений LinQ
Min()
иMax()
не имеют перегрузки без исключений. Для этогоIEnumerable
необходимо проверить дляAny()
перед вызовомMin()
илиMax()
// Max
var numbers = new int[] { };
var max = numbers.Any() ? numbers.Max() : 0;
// max = 0
сумма
Вычисляет сумму значений в коллекции.
Синтаксис метода
// Sum
var numbers = new int[] { 1, 2, 3, 4, 5 };
var sum = numbers.Sum();
// sum = 15
Синтаксис запроса
// Not applicable.
Операции квантификатора
Операции квантора возвращают логическое значение, указывающее, удовлетворяют ли некоторые или все элементы в последовательности условию.
Все
Определяет, удовлетворяют ли все элементы в последовательности условию.
Синтаксис метода
// All
var numbers = new int[] { 1, 2, 3, 4, 5 };
bool areLessThan10 = numbers.All(n => n < 10);
// areLessThan10 = true
Синтаксис запроса
// Not applicable.
любой
Определяет, удовлетворяют ли любые элементы в последовательности условию.
Синтаксис метода
// Any
var numbers = new int[] { 1, 2, 3, 4, 5 };
bool anyOneIsEven = numbers.Any(n => n % 2 == 0);
// anyOneIsEven = true
Синтаксис запроса
// Not applicable.
Содержит
Определяет, содержит ли последовательность указанный элемент.
Синтаксис метода
// Contains
var numbers = new int[] { 1, 2, 3, 4, 5 };
bool appears = numbers.Contains(10);
// appears = false
Синтаксис запроса
// Not applicable.
Группировка операций
Группирование относится к операциям ввода данных в группы, так что элементы в каждой группе имеют общий атрибут.
Группа по
Элементы групп, которые имеют общий атрибут.
Синтаксис метода
// 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") }
Синтаксис запроса
// 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
Вставляет элементы в словарь «один-ко-многим», основанный на функции выбора ключа.
Синтаксис метода
// 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") }
// }
Синтаксис запроса
// Not applicable.
Операции с разделами
Разделение относится к операциям деления входной последовательности на две части без переупорядочения элементов, а затем возвращает один из разделов.
Пропускать
Пропускает элементы до заданной позиции в последовательности.
Синтаксис метода
// Skip
var numbers = new int[] { 1, 2, 3, 4, 5 };
var skipped = numbers.Skip(3);
// skipped = { 4, 5 }
Синтаксис запроса
// Not applicable.
SkipWhile
Пропускает элементы на основе функции предиката, пока элемент не удовлетворяет условию.
Синтаксис метода
// 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 }
Синтаксис запроса
// Not applicable.
принимать
Забирает элементы в определенную позицию в последовательности.
Синтаксис метода
// Take
var numbers = new int[] { 1, 2, 3, 4, 5 };
var taken = numbers.Take(3);
// taken = { 1, 2, 3 }
Синтаксис запроса
// Not applicable.
TakeWhile
Принимает элементы, основанные на функции предиката, пока элемент не удовлетворяет условию.
Синтаксис метода
// TakeWhile
var numbers = new int[] { 1, 3, 5, 2, 1, 3, 5 };
var takeLeadingOdds = numbers.TakeWhile(n => n % 2 != 0);
// takeLeadingOdds = { 1, 3, 5 }
Синтаксис запроса
// Not applicable.
Операции генерации
Генерация относится к созданию новой последовательности значений.
DefaultIfEmpty
Заменяет пустую коллекцию выделенной одноэлементной коллекцией по умолчанию.
Синтаксис метода
// DefaultIfEmpty
var nums = new int[0];
var numbers = nums.DefaultIfEmpty();
// numbers = { 0 }
Синтаксис запроса
// Not applicable.
пустой
Возвращает пустую коллекцию.
Синтаксис метода
// Empty
var empty = Enumerable.Empty<string>();
// empty = IEnumerable<string> { }
Синтаксис запроса
// Not applicable.
Спектр
Создает коллекцию, содержащую последовательность чисел.
Синтаксис метода
// Range
var range = Enumerable.Range(1, 5);
// range = { 1, 2, 3, 4, 5 }
Синтаксис запроса
// Not applicable.
Повторение
Создает коллекцию, содержащую одно повторяющееся значение.
Синтаксис метода
// Repeat
var repeats = Enumerable.Repeat("s", 3);
// repeats = { "s", "s", "s" }
Синтаксис запроса
// Not applicable.
Установить операции
Операции установки относятся к операциям запроса, которые создают набор результатов, основанный на наличии или отсутствии эквивалентных элементов в пределах того же или отдельных коллекций (или наборов).
отчетливый
Удаляет повторяющиеся значения из коллекции.
Синтаксис метода
// Distinct
var numbers = new int[] { 1, 2, 3, 1, 2, 3 };
var distinct = numbers.Distinct();
// distinct = { 1, 2, 3 }
Синтаксис запроса
// Not applicable.
Кроме
Возвращает заданное различие, что означает элементы одной коллекции, которые не отображаются во второй коллекции.
Синтаксис метода
// 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 }
Синтаксис запроса
// Not applicable.
пересекаться
Возвращает заданное пересечение, что означает элементы, которые появляются в каждой из двух коллекций.
Синтаксис метода
// 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 }
Синтаксис запроса
// Not applicable.
союз
Возвращает объединение единиц, что означает уникальные элементы, которые появляются в любом из двух коллекций.
Синтаксис метода
// 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 }
Синтаксис запроса
// Not applicable.
Операции по обеспечению равенства
Две последовательности, соответствующие элементы которых равны и которые имеют одинаковое количество элементов, считаются равными.
SequenceEqual
Определяет, равны ли две последовательности, сравнивая элементы по-парному.
Синтаксис метода
// 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
Синтаксис запроса
// Not Applicable.
Элементные операции
Операции элементов возвращают один, определенный элемент из последовательности.
ElementAt
Возвращает элемент по указанному индексу в коллекции.
Синтаксис метода
// ElementAt
var strings = new string[] { "zero", "one", "two", "three" };
var str = strings.ElementAt(2);
// str = "two"
Синтаксис запроса
// Not Applicable.
ElementAtOrDefault
Возвращает элемент по указанному индексу в коллекции или по умолчанию, если индекс находится вне допустимого диапазона.
Синтаксис метода
// ElementAtOrDefault
var strings = new string[] { "zero", "one", "two", "three" };
var str = strings.ElementAtOrDefault(10);
// str = null
Синтаксис запроса
// Not Applicable.
Первый
Возвращает первый элемент коллекции или первый элемент, который удовлетворяет условию.
Синтаксис метода
// First
var numbers = new int[] { 1, 2, 3, 4, 5 };
var first = strings.First();
// first = 1
Синтаксис запроса
// Not Applicable.
FirstOrDefault
Возвращает первый элемент коллекции или первый элемент, который удовлетворяет условию. Возвращает значение по умолчанию, если такой элемент не существует.
Синтаксис метода
// FirstOrDefault
var numbers = new int[] { 1, 2, 3, 4, 5 };
var firstGreaterThanTen = strings.FirstOrDefault(n => n > 10);
// firstGreaterThanTen = 0
Синтаксис запроса
// Not Applicable.
Прошлой
Возвращает последний элемент коллекции или последний элемент, удовлетворяющий условию.
Синтаксис метода
// Last
var numbers = new int[] { 1, 2, 3, 4, 5 };
var last = strings.Last();
// last = 5
Синтаксис запроса
// Not Applicable.
LastOrDefault
Возвращает последний элемент коллекции или последний элемент, удовлетворяющий условию. Возвращает значение по умолчанию, если такой элемент не существует.
Синтаксис метода
// LastOrDefault
var numbers = new int[] { 1, 2, 3, 4, 5 };
var lastGreaterThanTen = strings.LastOrDefault(n => n > 10);
// lastGreaterThanTen = 0
Синтаксис запроса
// Not Applicable.
не замужем
Возвращает единственный элемент коллекции или единственный элемент, который удовлетворяет условию.
Синтаксис метода
// Single
var numbers = new int[] { 1 };
var single = strings.Single();
// single = 1
Синтаксис запроса
// Not Applicable.
SingleOrDefault
Возвращает единственный элемент коллекции или единственный элемент, который удовлетворяет условию. Возвращает значение по умолчанию, если такой элемент не существует или коллекция не содержит ровно один элемент.
Синтаксис метода
// SingleOrDefault
var numbers = new int[] { 1, 2, 3, 4, 5 };
var singleGreaterThanFour = strings.SingleOrDefault(n => n > 4);
// singleGreaterThanFour = 5
Синтаксис запроса
// Not Applicable.