MinBy / MaxBy în C# (.NET)

Întorc elementul cu cea mai mică sau cea mai mare valoare a unei chei (de exemplu elevul cu nota maximă), nu doar valoarea.

Sintaxă C#
var cel = sursa.MaxBy(x => x.Nota);   sursa.MinBy(x => x.Pret)

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ând MaxBy o parcurge o dată.
  • Folosirea rezultatului MaxBy fără verificare de null câ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).