Aggregate în C# (.NET)

Reduce o secvență la o singură valoare, aplicând o funcție pe rând: acumulatorul plus elementul curent (fold/reduce).

Sintaxă C#
sursa.Aggregate((acc, x) => ...)   sursa.Aggregate(seed, (acc, x) => ..., acc => rezultat)

Ce face Aggregate

Aggregate parcurge secvența și ține un acumulator. La fiecare element apelează funcția (acumulator, element) => acumulatorNou, iar la final întoarce acumulatorul. Sum, Max sau string.Join sunt cazuri particulare; Aggregate e pentru restul.

Fără valoare inițială (seed), primul element devine acumulatorul, iar pe o secvență goală metoda aruncă InvalidOperationException. Cu seed, secvența goală întoarce chiar seed-ul, iar tipul acumulatorului poate fi diferit de cel al elementelor. A treia formă primește și o funcție care transformă rezultatul final.

Parametri

Parametru Descriere
seed Opțional: valoarea de pornire a acumulatorului.
func (acc, x) => ...: combină acumulatorul cu elementul curent.
resultSelector Opțional: transformă acumulatorul final.

Exemple

Exemplul 1: Produs, concatenare și sold cu seed

int[] numere = [1, 2, 3, 4];
Console.WriteLine(numere.Aggregate((a, b) => a * b));

string[] cuvinte = ["C#", "este", "clar"];
Console.WriteLine(cuvinte.Aggregate((a, b) => a + " " + b));

int[] tranzactii = [100, -30, 50];
string sold = tranzactii.Aggregate(1000, (acc, x) => acc + x, acc => $"Sold final: {acc} lei");
Console.WriteLine(sold);

Rezultat

24
C# este clar
Sold final: 1120 lei

Exemplul 2: Cel mai lung nume și secvența goală

string[] nume = ["Ana", "Alexandra", "Ion", "Mihaela"];
Console.WriteLine(nume.Aggregate((celMaiLung, n) => n.Length > celMaiLung.Length ? n : celMaiLung));

int[] gol = [];
Console.WriteLine(gol.Aggregate(0, (acc, x) => acc + x));
try
{
    gol.Aggregate((a, b) => a + b);
}
catch (InvalidOperationException)
{
    Console.WriteLine("Secvență goală fără seed");
}

Rezultat

Alexandra
0
Secvență goală fără seed

Greșeli frecvente

  • Aggregate fără seed pe o listă care poate fi goală aruncă excepție. Dă o valoare inițială.
  • Concatenarea multor șiruri cu Aggregate creează un șir nou la fiecare pas. Pentru liste mari, string.Join sau StringBuilder sunt mai eficiente.
  • În Entity Framework Core, Aggregate nu se traduce în SQL; folosește Sum, Count, Max sau mută calculul în memorie conștient.

Comenzi înrudite

  • CountBy, AggregateBy și Index (.NET 9): CountBy numără elementele pe chei, AggregateBy calculează un total pe chei, iar Index dă poziția fiecărui element, fără GroupBy.
  • Expresii lambda (=>): O funcție scurtă, fără nume, scrisă pe loc: parametri => rezultat. Se folosește în LINQ, la evenimente și oriunde se cere un delegat.