Sobes.tech
Junior

Milyen típusú objektumokat lehet használni a foreach ciklusban C#-ban?

sobes.tech MI

Válasz az MI-től

C# nyelvben a foreach ciklusban bármilyen olyan objektumtípus használható, amely az alábbi interfészek egyikét implementálja:

  • System.Collections.IEnumerable - Nem generikus kollekciókhoz. Nem generikus enumerátort IEnumerator biztosít.
  • System.Collections.Generic.IEnumerable<T> - Generikus kollekciókhoz. Generikus enumerátort IEnumerator<T> biztosít.

Egy osztály vagy struktúra szintén használható a foreach-ben, ha rendelkezik nyilvános GetEnumerator() metódussal, amely a következő szignatúrát implementálja (ezt nevezik pattern-alapú foreach-nek):

  • Nyilvános Current tulajdonság, amely bármilyen típusú értéket visszaad.
  • Nyilvános MoveNext() metódus, amely bool értéket ad vissza.
  • Opcionálisan, nyilvános Dispose() metódus (a források helyes felszabadításához using-gal együtt).

Beépített típus példák, amelyeket használhatunk:

  • Tömbök (int[], string[], stb.)
  • A System.Collections névtérből származó kollekciók: ArrayList, Hashtable, Queue, Stack.
  • A System.Collections.Generic névtérből származó kollekciók: List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>.
  • Szövegek (string) - ezek karakterláncok char típusú karakterekből.

Példa egy saját típusra, amely támogatja a foreach-t a mintának megfelelően:

// Egyszerű saját típus, amely támogatja a foreach-t
public class MyEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    // GetEnumerator metódus, amely támogatja a foreach-t a mintának megfelelően
    public MyEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }

    // Belső enumerátor osztály
    public class MyEnumerator
    {
        private int[] data;
        private int currentIndex = -1;

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

        // Current tulajdonság
        public int Current => data[currentIndex];

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

        // Dispose metódus (opcionális)
        public void Dispose()
        {
            // Erőforrások felszabadítása, ha szükséges
        }
    }
}

// Használat a `foreach`-ben
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
//     // Console.WriteLine(item);
// }