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)saulist.Add(x)în timpul unuiforeachpe aceeași listă aruncăInvalidOperationException: Collection was modified.- Atribuirea variabilei buclei (
nota = 10;) nu se compilează. Ca să modifici elementele unei liste, foloseșteforcu 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.