Operațiuni agregate
Operațiunile agregate includ diverse operațiuni asupra selecțiilor, cum ar fi obținerea numărului de elemente, obținerea valorii minime, maxime și medii în selecție, precum și sumarea valorilor.
Metoda Aggregate
Metoda Aggregate efectuează o agregare generală a elementelor colecției în funcție de expresia specificată. De exemplu:
int[] numbers = { 1, 2, 3, 4, 5 };
int query = numbers.Aggregate((x, y) => x - y);
Console.WriteLine(query); // -13
Variabila query va reprezenta rezultatul agregării array-ului. Ca și condiție de agregare se folosește expresia (x, y) => x - y, adică inițial se scade al doilea element din primul, apoi al treilea din rezultat și așa mai departe. Astfel, va fi echivalent cu expresia:
int query = 1 - 2 - 3 - 4 - 5;
Rezultatul va fi -13. Putem folosi orice alte operațiuni, de exemplu, adunarea:
int query = numbers.Aggregate((x, y) => x + y); // echivalent cu 1 + 2 + 3 + 4 + 5
O altă versiune a metodei permite specificarea unei valori inițiale de la care începe lanțul operațiunilor de agregare:
string[] words = { "Gaudeamus", "igitur", "Juvenes", "dum", "sumus" };
var sentence = words.Aggregate("Text:", (first, next) => $"{first} {next}");
Console.WriteLine(sentence); // Text: Gaudeamus igitur Juvenes dum sumus
În acest caz, toate elementele array-ului words sunt combinate, dar primul element al operațiunii de agregare va fi șirul "Text:".
Obținerea dimensiunii selecției - Metoda Count
Pentru a obține numărul de elemente dintr-o selecție se folosește metoda Count():
int[] numbers = { 1, 2, 3, 4, 10, 34, 55, 66, 77, 88 };
int size = numbers.Count(); // 10
Console.WriteLine(size);
Metoda Count() într-una din versiunile sale poate primi și o expresie lambda care stabilește condiția de selecție. Astfel, putem în acest caz să nu folosim expresia Where:
int[] numbers = { 1, 2, 3, 4, 10, 34, 55, 66, 77, 88 };
// numărul de numere pare care sunt mai mari de 10
int size = numbers.Count(i => i % 2 == 0 && i > 10);
Console.WriteLine(size); // 3
Obținerea sumei
Pentru a obține suma valorilor se folosește metoda Sum:
int[] numbers = { 1, 2, 3, 4, 10, 34, 55, 66, 77, 88 };
int sum = numbers.Sum();
Console.WriteLine(sum); // 340
Metoda Sum() are mai multe suprascrieri. În special, dacă avem un set de obiecte complexe, cum este exemplul de mai sus, putem specifica proprietatea ale cărei valori vor fi însumate:
Person[] people = { new Person("Tom", 37), new Person("Sam", 28), new Person("Bob", 41) };
int ageSum = people.Sum(p => p.Age);
Console.WriteLine(ageSum); // 106
record class Person(string Name, int Age);
În acest caz, se calculează suma valorilor proprietății Age a obiectelor Person din array-ul people.
Valoarea maximă, minimă și medie
Pentru a găsi valoarea minimă se folosește metoda Min(), pentru a obține valoarea maximă - metoda Max(), iar pentru a găsi valoarea medie - metoda Average(). Acțiunea lor este similară cu metodele Sum și Count:
int[] numbers = { 1, 2, 3, 4, 10, 34, 55, 66, 77, 88 };
int min = numbers.Min();
int max = numbers.Max();
double average = numbers.Average();
Console.WriteLine($"Min: {min}"); // Min: 1
Console.WriteLine($"Max: {max}"); // Max: 88
Console.WriteLine($"Average: {average}"); // Average: 34
Dacă lucrăm cu obiecte complexe, în aceste metode se transmite un delegat care specifică proprietatea aplicată în calcule:
Person[] people = { new Person("Tom", 37), new Person("Sam", 28), new Person("Bob", 41) };
int minAge = people.Min(p => p.Age); // vârsta minimă
int maxAge = people.Max(p => p.Age); // vârsta maximă
double averageAge = people.Average(p => p.Age); // vârsta medie
Console.WriteLine($"Min Age: {minAge}"); // Min Age: 28
Console.WriteLine($"Max Age: {maxAge}"); // Max Age: 41
Console.WriteLine($"Average Age: {averageAge}"); // Average Age: 35,33
record class Person(string Name, int Age);
În acest caz, pentru calcule se folosește proprietatea Age, adică se calculează vârsta minimă, maximă și medie.