Sobes.tech
Junior

C#'ta foreach döngüsünde hangi nesne türleri kullanılabilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

C# dilinde foreach döngüsünde, aşağıdaki arayüzlerden birini uygulayan herhangi bir nesne tipi kullanılabilir:

  • System.Collections.IEnumerable - Genel olmayan koleksiyonlar için. Genel olmayan bir yineleyici IEnumerator sağlar.
  • System.Collections.Generic.IEnumerable<T> - Genel koleksiyonlar için. Genel bir yineleyici IEnumerator<T> sağlar.

Bir sınıf veya yapı, eğer aşağıdaki imzayı uygulayan bir GetEnumerator() adlı genel bir metoda sahipse, foreach içinde kullanılabilir (buna pattern tabanlı foreach denir):

  • Herhangi bir tür döndüren Current adlı genel bir özellik.
  • bool döndüren MoveNext() adlı genel bir metod.
  • Opsiyonel olarak, kaynakların doğru şekilde serbest bırakılması için Dispose() adlı genel bir metod (kullanım sırasında using ile birlikte).

Kullanılabilecek yerleşik tür örnekleri:

  • Diziler (int[], string[] vb.)
  • System.Collections isim alanındaki koleksiyonlar: ArrayList, Hashtable, Queue, Stack.
  • System.Collections.Generic isim alanındaki koleksiyonlar: List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>.
  • Dizgeler (string) - bunlar char karakter dizisidir.

foreach ile kullanılabilen, pattern'e uygun bir özel tür örneği:

// `foreach` destekleyen basit özel tür
public class MyEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    // Pattern'e uygun `GetEnumerator` metodu
    public MyEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }

    // İç sınıf - enumerator
    public class MyEnumerator
    {
        private int[] data;
        private int currentIndex = -1;

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

        // `Current` özelliği
        public int Current => data[currentIndex];

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

        // `Dispose` metodu (opsiyonel)
        public void Dispose()
        {
            // Kaynakların serbest bırakılması gerekirse
        }
    }
}

// `foreach` kullanımı
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
//     // Console.WriteLine(item);
// }