Any, All, Count și Sum în C# (.NET)

LINQ (Language Integrated Query) .NET 3.5+ / C# 3.0+

Evaluează condiții booleene rapide (cu scurtcircuitare) și calculează agregări numerice (Count, Sum, Average, Min, Max) peste colecții.

Sintaxă C#
bool exista = colectie.Any(x => conditie); | int nr = colectie.Count(x => conditie); | decimal total = colectie.Sum(x => x.Pret);

Ce face Any, All, Count și Sum

Metodele de cuantificare Any și All verifică dacă cel puțin un element, respectiv toate elementele dintr-o secvență îndeplinesc o condiție. Ambele folosesc evaluarea cu scurtcircuitare (short-circuit evaluation): Any returnează true și oprește parcurgerea în secunda în care găsește primul element potrivit, iar All returnează false și se oprește imediat ce întâlnește primul element care încalcă regula.

Pentru calcule statistice și agregări, LINQ oferă metodele terminale Count (numărul de elemente care respectă un predicat), Sum (suma valorilor), Average (media aritmetică), Min și Max. Toate aceste metode parcurg secvența imediat și returnează o valoare scalară.

Parametri, metode și opțiuni

Parametru / Metodă Descriere
source.Any() / source.Any(predicat) Returnează true dacă secvența conține cel puțin un element (sau cel puțin un element care respectă predicatul).
source.All(predicat) Returnează true dacă toate elementele respectă predicatul (atenție: returnează true pe o colecție goală — vacuous truth).
source.Count() / source.Count(predicat) Returnează numărul total de elemente sau numărul celor pentru care predicatul este true.
source.Sum(x => x.Valoare) Calculează suma numerică a proprietății selectate (returnează 0 dacă secvența este goală).
source.Average(x => x.Valoare) Calculează media aritmetică (aruncă InvalidOperationException dacă secvența este goală).
source.Min(x => ...) / Max(x => ...) Returnează valoarea minimă, respectiv maximă din secvență.

Exemple

Exemplul 1: Validarea unui coș de cumpărături cu Any și All

Verificăm rapid dacă există produse fără stoc în coș și dacă toate articolele au prețul validat.

var cos = new[]
{
    new ArticolCos("Carte C# 12",Cantitate: 1, PretUnitar: 145.00m, InStoc: true),
    new ArticolCos("Licență IDE", Cantitate: 2, PretUnitar: 450.00m, InStoc: true),
    new ArticolCos("Hub USB-C",   Cantitate: 1, PretUnitar: 180.00m, InStoc: true)
};

bool areProduse = cos.Any();
bool toateInStoc = cos.All(a => a.InStoc && a.Cantitate > 0);
bool existaProdusScump = cos.Any(a => a.PretUnitar >= 400m);

int totalBucati = cos.Sum(a => a.Cantitate);
decimal totalPlata = cos.Sum(a => a.Cantitate * a.PretUnitar);

Console.WriteLine($"Coș valid pentru comandă: {areProduse && toateInStoc}");
Console.WriteLine($"Conține produs >= 400 RON: {existaProdusScump}");
Console.WriteLine($"Total bucăți: {totalBucati} | Total de plată: {totalPlata:F2} RON");

record ArticolCos(string Nume, int Cantitate, decimal PretUnitar, bool InStoc);

Ieșire în consolă

Coș valid pentru comandă: True
Conține produs >= 400 RON: True
Total bucăți: 4 | Total de plată: 1225.00 RON

Exemplul 2: Statistici rapide cu Count(predicat), Min, Max și Average

Calculăm rata de promovare și statisticile notelor unui examen.

double[] note = [8.50, 4.20, 9.75, 6.80, 10.00, 7.40];

int promovati = note.Count(n => n >= 5.00);
double media = note.Average();
double notaMin = note.Min();
double notaMax = note.Max();

Console.WriteLine($"Promovați: {promovati}/{note.Length} | Media: {media:F2} | Interval: [{notaMin:F2} .. {notaMax:F2}]");

Ieșire în consolă

Promovați: 5/6 | Media: 7.78 | Interval: [4.20 .. 10.00]

Greșeli frecvente

  • Folosirea colectie.Count(x => conditie) > 0 în loc de colectie.Any(x => conditie) — metoda Count parcurge întreaga colecție până la ultimul element pentru a număra toate potrivirile, în timp ce Any se oprește la primul element găsit.
  • Apelarea Average(), Min() sau Max() pe o secvență de tipuri valoare care poate fi goală (fără a verifica înainte cu Any()), ceea ce aruncă InvalidOperationException: Sequence contains no elements (spre deosebire de Sum(), care returnează 0 pe o secvență goală).

Funcții și concepte înrudite

  • Enumerable.Where: Filtrează declarativ o secvență de elemente pe baza unui predicat lambda, cu execuție amânată (deferred execution).
  • GroupBy: Grupează elementele unei secvențe după o cheie comună pentru a calcula statistici, sume și agregări pe categorii.
  • FirstOrDefault / SingleOrDefault: Extrage un singur element dintr-o secvență (primul găsit sau unicul existent) ori returnează o valoare implicită când nu există potriviri.