CountBy, AggregateBy și Index (.NET 9) în C# (.NET)

CountBy numără elementele pe chei, AggregateBy calculează un total pe chei, iar Index dă poziția fiecărui element, fără GroupBy.

Sintaxă C#
sursa.CountBy(x => x.Cheie)   sursa.AggregateBy(x => x.Cheie, seed, (acc, x) => ...)   sursa.Index()

Ce face CountBy, AggregateBy și Index (.NET 9)

Înainte de .NET 9, numărarea pe categorii se scria GroupBy(x => x.Cheie).Select(g => (g.Key, g.Count())), care ține toate grupurile în memorie. CountBy(cheie) întoarce direct perechi KeyValuePair<TKey, int>, iar AggregateBy(cheie, seed, func) calculează un acumulator separat pentru fiecare cheie (sumă, maxim, concatenare).

Index() întoarce tuple-uri (int Index, T Item), cu poziția fiecărui element începând de la 0, așa că un foreach poate avea și indice fără contor manual.

Exemple

Exemplul 1: Vizite pe oraș și total pe client

string[] vizite = ["Iași", "Cluj", "Iași", "Arad", "Iași", "Cluj"];
foreach (var (oras, numar) in vizite.CountBy(o => o))
    Console.WriteLine($"{oras}: {numar}");

(string Client, int Total)[] comenzi = [("Ana", 250), ("Mihai", 90), ("Ana", 40)];
foreach (var (client, total) in comenzi.AggregateBy(c => c.Client, 0, (acc, c) => acc + c.Total))
    Console.WriteLine($"{client}: {total} lei");

Rezultat

Iași: 3
Cluj: 2
Arad: 1
Ana: 290 lei
Mihai: 90 lei

Exemplul 2: Clasament cu Index

string[] clasament = ["Ioana", "Ana", "Mihai"];

foreach (var (pozitie, nume) in clasament.Index())
    Console.WriteLine($"{pozitie + 1}. {nume}");

Rezultat

1. Ioana
2. Ana
3. Mihai

Greșeli frecvente

  • Metodele nu există înainte de .NET 9: pe .NET 8 primești eroarea că CountBy nu este definit.
  • Index() numără de la 0; pentru un clasament adaugă 1 la afișare.
  • Ordinea rezultatelor nu este documentată ca garantată; sortează-le dacă afișezi un clasament.

Comenzi înrudite

  • Aggregate: Reduce o secvență la o singură valoare, aplicând o funcție pe rând: acumulatorul plus elementul curent (fold/reduce).
  • ToDictionary / ToLookup: Transformă o secvență într-un Dictionary (o valoare per cheie) sau într-un ILookup (mai multe valori per cheie), pentru căutare rapidă.
  • foreach: Parcurge pe rând fiecare element al unui tablou, al unei liste sau al oricărui IEnumerable, fără indice.