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
Aggregatefără seed pe o listă care poate fi goală aruncă excepție. Dă o valoare inițială.- Concatenarea multor șiruri cu
Aggregatecreează un șir nou la fiecare pas. Pentru liste mari,string.JoinsauStringBuildersunt mai eficiente. - În Entity Framework Core,
Aggregatenu se traduce în SQL; foloseșteSum,Count,Maxsau 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.