Sobes.tech
Junior

Quels types d'objets peut-on utiliser dans une boucle foreach en C#?

sobes.tech IA

Réponse de l'IA

Dans la boucle foreach en C#, vous pouvez utiliser n'importe quel type d'objet qui implémente l'une des interfaces suivantes :

  • System.Collections.IEnumerable - Pour les collections non génériques. Fournit un itérateur non générique IEnumerator.
  • System.Collections.Generic.IEnumerable<T> - Pour les collections génériques. Fournit un itérateur générique IEnumerator<T>.

Une classe ou une structure peut également être utilisée dans foreach si elle possède une méthode publique GetEnumerator(), qui retourne une instance d'une classe ou structure implémentant la signature suivante (appelé foreach basé sur le pattern) :

  • Propriété publique Current, qui retourne n'importe quel type.
  • Méthode publique MoveNext(), qui retourne un booléen.
  • Optionnellement, une méthode publique Dispose() (pour libérer correctement les ressources lors de l'utilisation de using).

Exemples de types intégrés pouvant être utilisés :

  • Tableaux (int[], string[], etc.)
  • Collections du namespace System.Collections : ArrayList, Hashtable, Queue, Stack.
  • Collections du namespace System.Collections.Generic : List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>.
  • Chaînes (string) - qui sont des séquences de caractères char.

Exemple d'un type personnalisé supportant foreach selon le pattern :

// Type personnalisé simple supportant foreach
public class MyEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    // Méthode GetEnumerator supportant foreach selon le pattern
    public MyEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }

    // Classe interne de l'énumérateur
    public class MyEnumerator
    {
        private int[] data;
        private int currentIndex = -1;

        public MyEnumerator(int[] data)
        {
            this.data = data;
        }

        // Propriété Current
        public int Current => data[currentIndex];

        // Méthode MoveNext
        public bool MoveNext()
        {
            currentIndex++;
            return currentIndex < data.Length;
        }

        // Méthode Dispose (optionnelle)
        public void Dispose()
        {
            // Libération des ressources si nécessaire
        }
    }
}

// Utilisation dans foreach
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
//     // Console.WriteLine(item);
// }