Sobes.tech
Junior

Aké typy objektov je možné použiť v cykle foreach v C#?

sobes.tech AI

Odpoveď od AI

V slučajevu foreach v jazyku C# je možné použiť akékoľvek typy objektov, ktoré implementujú jeden z nasledujúcich rozhraní:

  • System.Collections.IEnumerable - pre neuniverzálne kolekcie. Poskytuje neuniverzálneho enumerátora IEnumerator.
  • System.Collections.Generic.IEnumerable<T> - pre univerzálne kolekcie. Poskytuje univerzálneho enumerátora IEnumerator<T>.

Trieda alebo štruktúra môžu byť tiež použité v foreach, ak majú verejnú metódu GetEnumerator(), ktorá vracia inštanciu triedy/štruktúry implementujúcej nasledujúcu signatúru (toto sa nazýva pattern-based foreach):

  • Verejná vlastnosť Current, ktorá vracia akýkoľvek typ.
  • Verejná metóda MoveNext(), ktorá vracia bool.
  • Voliteľne, verejná metóda Dispose() (pre správne uvoľnenie zdrojov pri použití using).

Príklady vstavaných typov, ktoré je možné použiť:

  • Polia (int[], string[] a pod.)
  • Kolekcie z priestoru mien System.Collections: ArrayList, Hashtable, Queue, Stack.
  • Kolekcie z priestoru mien System.Collections.Generic: List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>.
  • Riadky (string) - sú to sekvencie znakov char.

Príklad používateľského typu, ktorý podporuje foreach podľa vzoru:

// Jednoduchý používateľský typ, ktorý podporuje foreach
public class MyEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    // Metóda GetEnumerator, ktorá podporuje foreach podľa vzoru
    public MyEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }

    // Vnorená trieda - enumerátor
    public class MyEnumerator
    {
        private int[] data;
        private int currentIndex = -1;

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

        // Vlastnosť Current
        public int Current => data[currentIndex];

        // Metóda MoveNext
        public bool MoveNext()
        {
            currentIndex++;
            return currentIndex < data.Length;
        }

        // Metóda Dispose (voliteľná)
        public void Dispose()
        {
            // Uvoľnenie zdrojov, ak je potrebné
        }
    }
}

// Použitie v foreach
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
//     // Console.WriteLine(item);
// }