Содержание
Агрегатные операции в 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 можно рассчитать сумму, среднее значение выборки, определить её размер и так далее.