Home Insegnanti Contattami Portfolio

Foreach

1️⃣ Cos'è un ciclo foreach

Il ciclo foreach in C# è uno strumento di iterazione usato per scorrere gli elementi di una collezione o di un array in modo semplice e leggibile. Questo ciclo permette di accedere a ciascun elemento di una collezione senza dover usare un indice o gestire manualmente la condizione di uscita, come invece accade nei cicli for tradizionali.

Sintassi di base:

foreach (tipo elemento in collezione)
    {
        // Codice che utilizza l'elemento corrente
    }

Esempio di base con un array:

string[] colori = { "Rosso", "Verde", "Blu" };
    
    foreach (string colore in colori)
    {
        Console.WriteLine(colore);
    }
    
    /* Output:
    Rosso
    Verde
    Blu
    */

2️⃣ Perché usare foreach

Il ciclo foreach è particolarmente utile quando:

Rispetto ad altri cicli (for e while), foreach rende il codice meno soggetto a errori perché non richiede di sapere la lunghezza della collezione o di incrementare un contatore.

3️⃣ foreach con diversi tipi di collezioni

In C#, foreach può essere usato su qualsiasi collezione che implementi l’interfaccia IEnumerable o IEnumerable<T>.

Esempio con una lista (List<T>):

List<int> numeri = new List<int> { 1, 2, 3, 4, 5 };
    
    foreach (int numero in numeri)
    {
        Console.WriteLine(numero);
    }
    
    /* Output:
    1
    2
    3
    4
    5
    */

Esempio con un dizionario (Dictionary<TKey, TValue>):

Quando si scorre un dizionario, ogni elemento è una coppia KeyValuePair<TKey, TValue>:

Dictionary<string, int> età = new Dictionary<string, int>
    {
        { "Alice", 30 },
        { "Bob", 25 },
        { "Charlie", 35 }
    };
    
    foreach (KeyValuePair<string, int> persona in età)
    {
        Console.WriteLine($"{persona.Key} ha {persona.Value} anni.");
    }
    
    /* Output:
    Alice ha 30 anni.
    Bob ha 25 anni.
    Charlie ha 35 anni.
    */

Esempio con un array bidimensionale

Il foreach può essere usato per iterare sugli elementi di un array bidimensionale, anche se in questo caso la struttura interna non è accessibile come con un for:

int[,] matrice = { {1, 2}, {3, 4}, {5, 6} };
    
    foreach (int elemento in matrice)
    {
        Console.WriteLine(elemento);
    }
    
    /* Output
    1
    2
    3
    4
    5
    6
    */

4️⃣ Limitazioni di foreach

Sebbene foreach sia utile, ha alcune limitazioni:

Ad esempio, questo codice genera un errore:

List<int> numeri = new List<int> { 1, 2, 3 };
    
    foreach (int numero in numeri)
    {
        if (numero == 2)
        {
            numeri.Remove(numero);  // Questo genererà un'eccezione
        }
    }

Per modificare la collezione, si può usare un ciclo for inverso o un ciclo for standard per evitare eccezioni.

5️⃣ foreach e LINQ

In combinazione con le espressioni LINQ (Language-Integrated Query), foreach diventa ancora più potente. Possiamo, ad esempio, filtrare gli elementi in una collezione prima di iterare su di essi.

Esempio di foreach con LINQ:

List<int> numeri = new List<int> { 1, 2, 3, 4, 5 };
    
    var numeriPari = numeri.Where(n => n % 2 == 0);
    
    foreach (int numero in numeriPari)
    {
        Console.WriteLine(numero);
    }
    
    /* Output:
    2
    4
    */

6️⃣ Esempi pratici

Iterare su una lista di oggetti personalizzati:

public class Studente
    {
        public string Nome { get; set; }
        public int Età { get; set; }
    }
    
    List<Studente> studenti = new List<Studente>
    {
        new Studente { Nome = "Alice", Età = 20 },
        new Studente { Nome = "Bob", Età = 22 },
        new Studente { Nome = "Charlie", Età = 21 }
    };
    
    foreach (Studente studente in studenti)
    {
        Console.WriteLine($"{studente.Nome} ha {studente.Età} anni.");
    }
    
    /* Output:
    Alice ha 20 anni.
    Bob ha 22 anni.
    Charlie ha 21 anni.
    */

Iterare su una stringa:

In C#, anche una stringa è una collezione di caratteri (char), quindi è possibile usare foreach per accedere a ciascun carattere:

string parola = "CSharp";
    
    foreach (char lettera in parola)
    {
        Console.Write(lettera + " ");
    }
    
    /* Output:
    C S h a r p
    */

📑 Esercizi

Vi propongo, per iniziare a familiarizzare con questa lezione, di provare a riscrivere alcuni cicli for che avete già scritto usando il foreach dove possibile.