Sobes.tech
Junior

C#-da foreach döngüsündə hansı obyekt tipləri istifadə oluna bilər?

sobes.tech Süni İntellekt

AI-dan cavab

C# dilində foreach döngüsündə, aşağıdakı interfeyslərdən birini tətbiq edən hər hansı obyekt növü istifadə oluna bilər:

  • System.Collections.IEnumerable - Qeyri-ənənəvi kolleksiyalar üçün. Qeyri-ənənəvi enumerator IEnumerator təmin edir.
  • System.Collections.Generic.IEnumerable<T> - Ənənəvi kolleksiyalar üçün. Ənənəvi enumerator IEnumerator<T> təmin edir.

Bir sinif və ya struktur, əgər GetEnumerator() adlı ictimai metodu varsa və aşağıdakı imzaya uyğun bir nümunə qaytarırsa, foreach-də istifadə oluna bilər (buna pattern əsaslı foreach deyilir):

  • Hər hansı bir tip qaytaran ictimai Current xüsusiyyəti.
  • bool qaytaran ictimai MoveNext() metodu.
  • İstəyə bağlı olaraq, Dispose() adlı ictimai metod (resursların düzgün sərbəst buraxılması üçün using ilə istifadə edilərkən).

İstifadə oluna bilən daxili tiplər nümunələri:

  • Massivlər (int[], string[] və s.)
  • System.Collections ad sahəsindən kolleksiyalar: ArrayList, Hashtable, Queue, Stack.
  • System.Collections.Generic ad sahəsindən kolleksiyalar: List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>.
  • Sətirlər (string) - bunlar char simvol ardıcıllığıdır.

foreach üçün pattern-ə uyğun dəstək verən xüsusi tip nümunəsi:

// Sadə pattern-ə uyğun `foreach` dəstəkləyən xüsusi tip
public class MyEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    // Pattern-ə uyğun `GetEnumerator` metodu
    public MyEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }

    // Daxili enumerator sinfi
    public class MyEnumerator
    {
        private int[] data;
        private int currentIndex = -1;

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

        // `Current` xüsusiyyəti
        public int Current => data[currentIndex];

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

        // `Dispose` metodu (istəyə bağlı)
        public void Dispose()
        {
            // Resursların sərbəst buraxılması, lazım olarsa
        }
    }
}

// `foreach` istifadə nümunəsi
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
//     // Console.WriteLine(item);
// }