Sobes.tech
Junior

Milliseid objektitüüpe saab kasutada foreach-tsüklis C#-s?

sobes.tech AI

Vastus AI-lt

C# keeles saab foreach tsüklit kasutada mis tahes objektitüüpide puhul, mis realiseerivad ühe järgmistest liidestest:

  • System.Collections.IEnumerable - mitteuniversaalsete kogude jaoks. Pakub mitteuniversaalset IEnumerator loendurit.
  • System.Collections.Generic.IEnumerable<T> - universaalsete kogude jaoks. Pakub universaalset IEnumerator<T> loendurit.

Klass või struktuur võib samuti olla kasutatav foreach, kui neil on avalik meetod GetEnumerator(), mis tagastab sellise objekti, mis realiseerib järgmise signatuuri (seda nimetatakse pattern-based foreach-ks):

  • Avalik omadus Current, mis tagastab mis tahes tüüpi.
  • Avalik meetod MoveNext(), mis tagastab bool.
  • Valikuline, avalik meetod Dispose() (õige ressursside vabastamise jaoks using-i kasutamisel).

Näited sisseehitatud tüüpide kohta, mida saab kasutada:

  • Massiivid (int[], string[] ja nii edasi)
  • System.Collections ruumi kogud: ArrayList, Hashtable, Queue, Stack.
  • System.Collections.Generic ruumi kogud: List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>.
  • Stringid (string) - need on tähemärkide järjestused char.

Näide kasutaja tüübi kohta, mis toetab foreach mustri järgi:

// Lihtne kasutaja tüüp, mis toetab `foreach`
public class MyEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    // GetEnumerator meetod, mis toetab `foreach`
    public MyEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }

    // Siseklass - loendur
    public class MyEnumerator
    {
        private int[] data;
        private int currentIndex = -1;

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

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

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

        // `Dispose` meetod (valikuline)
        public void Dispose()
        {
            // ressursside vabastamine, kui vaja
        }
    }
}

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