Sobes.tech
Junior

Jaké typy objektů lze použít v cyklu foreach v C#?

sobes.tech AI

Odpověď od AI

V cyklu foreach v C# lze použít jakýkoli typ objektu, který implementuje jednu z následujících rozhraní:

  • System.Collections.IEnumerable - pro neobecné kolekce. Poskytuje neobecného enumerátora IEnumerator.
  • System.Collections.Generic.IEnumerable<T> - pro obecné kolekce. Poskytuje generického enumerátora IEnumerator<T>.

Třída nebo struktura může být také použita v foreach, pokud má veřejnou metodu GetEnumerator(), která vrací instanci třídy nebo struktury implementující následující podpis (toto se nazývá pattern-based foreach):

  • Veřejná vlastnost Current, která vrací jakýkoli typ.
  • Veřejná metoda MoveNext(), která vrací bool.
  • Volitelně, veřejná metoda Dispose() (pro správné uvolnění zdrojů při použití using).

Příklady vestavěných typů, které lze použít:

  • Pole (int[], string[] atd.)
  • Kolekce z prostoru jmen System.Collections: ArrayList, Hashtable, Queue, Stack.
  • Kolekce z prostoru jmen System.Collections.Generic: List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>.
  • Řetězce (string) - jsou posloupností znaků char.

Příklad vlastního typu, který podporuje foreach podle vzoru:

// Jednoduchý vlastní typ podporující foreach
public class MyEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    // Metoda GetEnumerator, která podporuje foreach podle vzoru
    public MyEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }

    // Vnitřní třída enumerátoru
    public class MyEnumerator
    {
        private int[] data;
        private int currentIndex = -1;

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

        // Vlastnost Current
        public int Current => data[currentIndex];

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

        // Metoda Dispose (volitelná)
        public void Dispose()
        {
            // Uvolnění zdrojů, pokud je třeba
        }
    }
}

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