Sobes.tech
Junior

Welke soorten objecten kunnen worden gebruikt in een foreach-lus in C#?

sobes.tech AI

Antwoord van AI

In de foreach-lus in C# kunnen alle objecttypes worden gebruikt die een van de volgende interfaces implementeren:

  • System.Collections.IEnumerable - Voor niet-generieke collecties. Biedt een niet-generieke iterator IEnumerator.
  • System.Collections.Generic.IEnumerable<T> - Voor generieke collecties. Biedt een generieke iterator IEnumerator<T>.

Een klasse of structuur kan ook in foreach worden gebruikt als deze een publieke methode GetEnumerator() heeft, die een instantie retourneert van een klasse of structuur die de volgende handtekening implementeert (dit wordt pattern-based foreach genoemd):

  • Een publieke eigenschap Current, die elk type retourneert.
  • Een publieke methode MoveNext(), die een bool retourneert.
  • Optioneel, een publieke methode Dispose() (voor het correct vrijmaken van bronnen bij gebruik van using).

Voorbeelden van ingebouwde types die kunnen worden gebruikt:

  • Arrays (int[], string[], etc.)
  • Collecties uit de namespace System.Collections: ArrayList, Hashtable, Queue, Stack.
  • Collecties uit de namespace System.Collections.Generic: List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>.
  • Strings (string) - deze zijn een sequentie van tekens char.

Voorbeeld van een aangepaste type die foreach ondersteunt volgens het patroon:

// Eenvoudig aangepast type dat `foreach` ondersteunt
public class MyEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    // GetEnumerator-methode die `foreach` ondersteunt volgens het patroon
    public MyEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }

    // Interne klasse van de enumerator
    public class MyEnumerator
    {
        private int[] data;
        private int currentIndex = -1;

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

        // `Current` eigenschap
        public int Current => data[currentIndex];

        // `MoveNext` methode
        public bool MoveNext()
        {
            currentIndex++;
            return currentIndex < data.Length;
        }

        // `Dispose` methode (optioneel)
        public void Dispose()
        {
            // Resources vrijmaken indien nodig
        }
    }
}

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