LINQ Агрегатные операции

C Sharp > LINQ Агрегатные операции
02.12.2016 12:07:18



Статья:

К агрегатным операциям относят различные операции над выборкой, например, получение числа элементов, получение минимального, максимального и среднего значения в выборке, а также суммирование значений.
 
Метод Aggregate
 
Метод Aggregate выполняет общую агрегацию элементов коллекции в зависимости от указанного выражения. Например:
 
int[] numbers = { 1, 2, 3, 4, 5};
 
int query = numbers.Aggregate((x,y)=> x - y);
Переменная query будет представлять результат агрегации массива. В качестве условия агрегации используется выражение (x,y)=> x - y, то есть вначале из первого элемента вычитается второй, потом из получившегося значения вычитается третий и так далее. То есть юудет эквивалентно выражению:
 
int query = 1 - 2 - 3 - 4 - 5
В итоге мы получим число -13. Соответственно мы бы могли использовать любые другие операции, например, сложение:
 
 
int query = numbers.Aggregate((x,y)=> x + y); // аналогично 1 + 2 + 3 + 4 + 5
Получение размера выборки. Метод Count
 
Для получения числа элементов в выборке используется метод Count():
 
int[] numbers = { 1, 2, 3, 4, 10, 34, 55, 66, 77, 88 };
int size = (from i in numbers where i % 2 == 0 && i > 10 select i).Count();
Console.WriteLine(size);
Метод Count() в одной из версий также может принимать лямбда-выражение, которое устанавливает условие выборки. Поэтому мы можем в данном случае не использовать выражение Where:
 
int size = numbers.Count(i => i % 2 == 0 && i > 10);
Console.WriteLine(size);
Получение суммы
 
Для получения суммы значений применяется метод Sum:
 
int[] numbers = { 1, 2, 3, 4, 10, 34, 55, 66, 77, 88 };
List<User> users = new List<User>()
{
new User { Name = "Tom", Age = 23 },
new User { Name = "Sam", Age = 43 },
new User { Name = "Bill", Age = 35 }
};
 
int sum1 = numbers.Sum();
decimal sum2 = users.Sum(n => n.Age);
Метод Sum() имеет ряд перегрузок. В частности, если у нас набор сложных объектов, как в примере выше, то мы можем указать свойство, значения которого будут суммироваться: users.Sum(n => n.Age)
 
Максимальное, минимальное и среднее значения
 
Для нахождения минимального значения применяется метод Min(), для получения максимального - метод Max(), а для нахождения среднего значения - метод Average(). Их действие похоже на методы Sum и Count:
 
int[] numbers = { 1, 2, 3, 4, 10, 34, 55, 66, 77, 88 };
List<User> users = new List<User>()
{
new User { Name = "Tom", Age = 23 },
new User { Name = "Sam", Age = 43 },
new User { Name = "Bill", Age = 35 }
};
 
int min1 = numbers.Min();
int min2 = users.Min(n => n.Age); // минимальный возраст
 
int max1 = numbers.Max();
int max2 = users.Max(n => n.Age); // максимальный возраст
 
double avr1 = numbers.Average();
double avr2 = users.Average(n => n.Age); //средний возраст