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ă
CountBynu 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.