Содержание
Агрегатные операции в LINQ — это операции, которые приводят к объединению элементов выборки во что-либо. Так, к агрегатным операциям относятся такие методы как Average
, Min
,Max
, Count
и Aggregate
. Так, эти методы позволяют получить одно единое для всех элементов выборки значение, например, сумму всех элементов или их количество и т.д.
Метод Aggregate
Метод Aggregate
в LINQ проводит объединение элементов набора данных по заданному выражению, например:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var result = numbers.Aggregate((x, y) => x * y); Console.WriteLine(result);
В приведенном примере мы перемножили все элементы массива, т.е., по сути, вычислили факториал 9! = 1*2*3*4*5*6*7*8*9
. В методе Aggregate мы можем использовать и другие операции, например, сложение или вычитание:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var result = numbers.Aggregate((x, y) => x - y); Console.WriteLine(result);
Метод Count — получение размера выборки
Метод Count
позволяет получить количество элементов в наборе данных, например:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var result = numbers.Count(); Console.WriteLine($"Количество элементов в массиве: {result}");
Наибольший интерес, при этом, для нас будет иметь второй вариант метода Count
в параметр которого можно передать выражение на основании которого будет подсчитываться количество элементов, например:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var result = numbers.Count(x => x % 2 == 0); Console.WriteLine($"Количество четных элементов в массиве: {result}");
Результат выполнения:
Количество четных элементов в массиве: 4
Подсчёт суммы, определение среднего, минимального и максимального значения в LINQ
Следующие четыре агрегатные операции — это Sum
, Average
, Min
и Max
. Рассмотрим их работу на примере списка, который мы использовали в прошлый раз:
List<DataObject> objects = new List<DataObject>() { new DataObject {Name = "Измерение №1", Value = 12.5, Date = DateTime.Now }, new DataObject {Name = "Измерение №2", Value = 12.1, Date = DateTime.Now.AddDays(2) }, new DataObject {Name = "Измерение №3", Value = 80.5, Date = DateTime.Now.AddMonths(1) }, new DataObject {Name = "Измерение №4", Value = 11.3, Date = DateTime.Now.AddDays(7) }, new DataObject {Name = "Измерение №5", Value = 10.7, Date = DateTime.Now.AddHours(2.5) } };
Рассчитаем сумму, среднее, минимально и максимальное значение свойства Value
:
var avg = objects.Average(a => a.Value); Console.WriteLine($"Среднее значение: {avg}"); var sum = objects.Sum(s => s.Value); Console.WriteLine($"Сумма: {sum}"); var max = objects.Max(m => m.Value); Console.WriteLine($"Максимальное значение: {max}"); var min = objects.Min(m => m.Value); Console.WriteLine($"Минимальное значение: {min}");
Результат выполнения:
Сумма: 127,1
Максимальное значение: 80,5
Минимальное значение: 10,7
Итого
Сегодня мы рассмотрели агрегатные методы расширения в LINQ, которые позволяют объединять наборы данных по какому-либо критерию. Например, с помощью агрегатных методов LINQ можно рассчитать сумму, среднее значение выборки, определить её размер и так далее.