LINQ в C#: агрегатные операции

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Агрегатные операции в 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);
-43

Метод 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}");

Результат выполнения:

Среднее значение: 25,419999999999998
Сумма: 127,1
Максимальное значение: 80,5
Минимальное значение: 10,7

Итого

Сегодня мы рассмотрели агрегатные методы расширения в LINQ, которые позволяют объединять наборы данных по какому-либо критерию. Например, с помощью агрегатных методов LINQ можно рассчитать сумму, среднее значение выборки, определить её размер и так далее.

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии