Ce face MinBy / MaxBy
Max(x => x.Nota) întoarce valoarea maximă (10), dar nu și cine o are. MaxBy(x => x.Nota) întoarce chiar elementul. La egalitate, rămâne primul element întâlnit cu valoarea respectivă.
Pe o secvență goală, comportamentul depinde de tip: pentru tipuri referință (clase, record-uri) MinBy/MaxBy întorc null, iar pentru tipuri valoare aruncă InvalidOperationException. Max și Min pe o secvență goală de int aruncă și ele excepție.
Exemple
Exemplul 1: Elevul cu nota cea mai mare și cea mai mică
Ioana și Radu au amândoi 10; MaxBy îl întoarce pe primul.
Elev[] elevi = [new("Ana", 9), new("Mihai", 7), new("Ioana", 10), new("Radu", 10)];
Console.WriteLine(elevi.MaxBy(e => e.Nota));
Console.WriteLine(elevi.MinBy(e => e.Nota)!.Nume);
Console.WriteLine(elevi.Max(e => e.Nota));
record Elev(string Nume, int Nota);
Rezultat
Elev { Nume = Ioana, Nota = 10 }
Mihai
10
Exemplul 2: Secvență goală
List<Elev> gol = [];
Console.WriteLine(gol.MaxBy(e => e.Nota) is null);
try
{
Console.WriteLine(gol.Max(e => e.Nota));
}
catch (InvalidOperationException)
{
Console.WriteLine("Max pe listă goală");
}
record Elev(string Nume, int Nota);
Rezultat
True
Max pe listă goală
Greșeli frecvente
OrderByDescending(x => x.Nota).First()pentru maxim: sortează toată lista (O(n log n)), pe cândMaxByo parcurge o dată.- Folosirea rezultatului
MaxByfără verificare denullcând lista poate fi goală.
Comenzi înrudite
Aggregate: Reduce o secvență la o singură valoare, aplicând o funcție pe rând: acumulatorul plus elementul curent (fold/reduce).