IEnumerable, çalışma mantığını pek merak etmediğimiz, fakat sıklıkla kullandığımız “foreach” döngüsünü kullanmamıza sağlamakta.
Array, List, ArrayList, Hashtable vb. birçok koleksiyon IEnumerable sınıfını implement etmiştir. Bu sayede, foreach döngüsünü kullanarak bu koleksiyondaki elemanlara ulaşabilmekteyiz.
Bu ara yüzü biraz daha iyi tanımak için foreach yapısını incelemek gerekiyor. Foreach döngüsünün arka planında while döngüsü yatmakta. Yani run-time anında foreach yapısı while döngüsüne dönmekte. Döngünün ilerleyip; dizideki diğer elemanlara erişebilmesi içinde IEnumerable dan “GetEnumerator” metodu ile IEnumerator sınıfını talep etmekte.
IEnumerator ara yüzü 3 adet metot içermekte, bunlar: MoveNext, Current ve Reset metotlarıdır.
MoveNext metodu; dizideki bir sonraki elemana erişmemize sağlar.
Current metodu; dizinin o anki indeksindeki değeri getirir.
Reset metodu; dizinin indeksini -1’e çeker.
Bu yapıya örnek vermek gerekirse;
Yukarıdaki kodda dizi elemanlarını listbox’a atılmıştır. Foreach döngüsü çalışma anında hemen altındaki while döngüsüne dönüşmüştür.
Konuyu biraz anlamamız için kendi sınıfımızı yaratıp, foreach döngüsünü kullanmaya çalışalım. Ben “Liste” adlı bir sınıf oluşturdum ve bu sınıftan instance alıp foreach yapısında kullanmaya çalıştım.
Kodu derlediğimde Visual Studio hata verdi. Sebebi ise Liste sınıfının “GetEnumerator” metoduna sahip olmaması. YANİ LISTE SINIFININ FOREACH YAPISINI DESTEKLEMEDİĞİ HATASI.
Desteklemesi için sınıfımızın IEnumerable sınıfından türemesi gerekmete.
IEnumerable ara yüzü, “System.Collections” referansında yer almakta. Ara yüzü sınıfımıza iplement ettikten sonra otomatik olarak Studio; IEnumerator tipinde “GetEnumerator” metodunu oluşturmakta.
Foreach yapısı,bizden dizimizin ilerleyip diğer elemanlara ulaşmamız içinIEnumerable’dan IEnumerator sınıfından türemiş bir sınıf istemekte. Ben bunun için “Gezici” adlı bir sınıf yaratıp, IEnumerator ara yüzünü implement ettim.
İmplement ettikten sonra, Visual Studio otomatik olarak 3 tane metot oluşturdu. Bunlar MoveNext, Current ve Reset metotları.
3 metodu yukarıdaki gibi değiştirdikten sonra, Form_Load eventinde aşağıdaki kodları uyguluyoruz:
Uygulamayı çalıştırdığımızda;
Görüldüğü gibi uygulamamızda hata almadık, Sınıfımızı IEnumerable sınıfından türettik ve IEnumerator sınıfı ile de döngümüz de ilerleyip verileri gösterdik.
Umarım faydalı bir yazı olmuştur.