foreach în C# (.NET)

Parcurge pe rând fiecare element al unui tablou, al unei liste sau al oricărui IEnumerable, fără indice.

Sintaxă C#
foreach (var element in colectie) { ... }

Ce face foreach

foreach funcționează cu orice tip care are o metodă GetEnumerator(): tablouri, List<T>, Dictionary<TKey, TValue>, șiruri de caractere, rezultate LINQ. Variabila buclei este doar pentru citire: nu îi poți atribui altă valoare.

Nu adăuga și nu șterge elemente dintr-o List<T> sau dintr-un dicționar în timp ce îl parcurgi cu foreach: la pasul următor primești InvalidOperationException. Dacă ai nevoie și de poziție, folosește for sau metoda LINQ Index() (.NET 9).

Parametri

Parametru Descriere
element Variabila care primește elementul curent. Poate fi deconstruită: foreach (var (cheie, valoare) in dictionar).
colectie Tablou, listă, dicționar, string sau orice IEnumerable<T>.

Exemple

Exemplul 1: Listă și dicționar

Un dicționar se parcurge ca perechi cheie-valoare, care se pot deconstrui direct în buclă.

List<string> nume = ["Ana", "Mihai", "Ioana"];
foreach (string n in nume)
    Console.WriteLine($"Salut, {n}!");

var preturi = new Dictionary<string, int>
{
    ["pâine"] = 5,
    ["lapte"] = 8,
};
foreach (var (produs, pret) in preturi)
    Console.WriteLine($"{produs}: {pret} lei");

Rezultat

Salut, Ana!
Salut, Mihai!
Salut, Ioana!
pâine: 5 lei
lapte: 8 lei

Exemplul 2: Ștergere sigură: parcurgi o copie

ToList() face o copie, așa că lista originală poate fi modificată în buclă. Pentru o singură condiție, RemoveAll e și mai simplu.

List<int> note = [4, 9, 3, 10, 7];

foreach (int nota in note.ToList())
{
    if (nota < 5)
        note.Remove(nota);
}
Console.WriteLine(string.Join(", ", note));

note.RemoveAll(n => n < 8);
Console.WriteLine(string.Join(", ", note));

Rezultat

9, 10, 7
9, 10

Greșeli frecvente

  • list.Remove(x) sau list.Add(x) în timpul unui foreach pe aceeași listă aruncă InvalidOperationException: Collection was modified.
  • Atribuirea variabilei buclei (nota = 10;) nu se compilează. Ca să modifici elementele unei liste, folosește for cu indice.
  • Ordinea elementelor dintr-un HashSet<T> nu este garantată. Nu te baza pe ea în foreach.

Comenzi înrudite

  • for, break și continue: Repetă un bloc de cod cu un contor: inițializare, condiție și pas. break oprește bucla, continue sare la pasul următor.
  • IEnumerable<T> și yield return: IEnumerable<T> este orice secvență care se poate parcurge cu foreach; yield return produce elementele pe rând, doar când sunt cerute.