C# IEnumerable ve IEnumerator Interface

Merhaba arkadaşlar,

C# Collection yazımda koleksiyonlar hakkında genel hatlarıyla bilgi sahibi olduk. C# Collection yazıma buradan ulaşabilirsiniz. Programlama yaparken grup nesneleri ile çalıştığımız zamanlarda grup nesnemizin her bir elemanı ile işlem yapma ihtiyacı doğabilir. Grup nesnelerindeki elemanlara farklı yollardan erişebiliriz. Bu yollardan biri foreach döngüsü ile erişmek. foreach döngüsünün temel çalışma prensibi olan iterasyonun mantığını anlamak için kendi sınıflarımıza nasıl uygulanacağını inceleyeceğiz. Bu yazımda IEnumerable ve IEnumerator arayüzlerini ele alıp kendi yazacağımız sınıfa iterasyon özelliğini kazandırıp örnek ile pekiştireceğiz.

Şimdi kısaca IEnumerable ve IEnumerator arayüzlerinin tanımlarına bakalım

IEnumerable arayüzü, bir koleksyion tabanlı sınıfın elemanları arasında ilerlemek için kullanılır.

Hmmm o zaman bu arayüze ihtiyacımız var. Bu kenarda dursun!

IEnumerator arayüzü, bir koleksiyondaki her bir elemana erişmek ve diğer işlemleri yapmak için uygulanması gereken arayüzdür.

E buna da ihtiyacımız var! O zaman IEnumerable arayüzü ile sınıfımıza koleksiyondaki elemanlara erişebilme niteliğini kazandırıp, IEnumerator arayüzü ile foreach yapısı ile elde ettiğimiz eleman üzerinden işlem yapacağız. Şimdi oturmaya başladı 🙂 O zaman bu iki arayüzü kullanarak iterasyon yapısına uyacak bir örnek yapalım:

Senaryo şu şekilde olacak: Elimizde ürünlerimiz var ve bu ürünleri yönetebileceğimiz koleksiyona ihtiyacımız var. Bu yapı ile foreach döngüsüyle koleksiyondaki her bir elamana erişip işlem yapabilecek. O zaman ilk başta ürünleri yönetebileceğimiz bir yapıyı geliştirmeye başlayalım.

Ürünlerin özelliğini tutabilecek bir sınıfa ihtiyacımız var. Basit bir Product sınıfı oluşturuyorum.

Bu ürünleri yönetebileceğimiz ve foreach döngüsü ile çalışmasını garanti edebilecek ProductCollection adında bir sınıf oluşturuyoruz. Collection sınıfımıza Product nesnelerini saklayabilecek bir dizi özelliği ekliyoruz. Yapıcı metot yardımı ile ürünlerimizi bu sınıfa aktarıyoruz.

ProductCollection sınıfına IEnumerable arayüzünü uyguluyoruz. IEnumerable arayüzünde GetEnumerator() metodu bulunmaktadır. Bu metot sayesinde ProductCollection sınıfımız foreach döngüsü ile etkileşime girebilecek.

O zaman bizim bir IEnumerator arayüzünden türeyen bir sınıfa ihtiyacımız var. Bu vesile ile bir diğer ihtiyacımız olan iterasyon sınıfımızı yazmaya başlayalım. ProductEnumerator adında bir sınıf oluşturup IEnumerator arayüzünü uyguluyoruz.

IEnumerator arayüzünün başlıca bilmemiz gereken özellikleri var.

  • Current özelliği ile koleksiyondaki her bir elemana erişmek
  • MoveNext() metodu ile bir sonraki elemana ilerleyip ilerlemeyeceğine karar verir
  • Reset() metodu ile koleksiyonu sıfırlar ve ilk konumuna getirir.

Enumerator sınıfımızın elemanlara ihtiyacı var. O yüzden sınıfımıza Product nesnesinden oluşan bir dizi özelliği ekliyoruz ve yapıcı metodu ile elemanları ProductEnumerator sınıfımıza aktarıyoruz.

Artık elimizde Product türünden elemanlarımız var. Bu elemanlar arası ilerleyebilmemiz için MoveNext() metodunu uygulamamız gerekiyor. Şimdi bu metodu uygulayalım.

ProductEnumerator sınıfında ürünlerimiz Product türünden bir dizi içinde saklanıyor. Yani bu ürünlere index yolu ile erişebiliriz anlamına geliyor. MoveNext() metodunda index artırıp bir sonraki elemana gidebilir miyiz? kontrolünü yapıyoruz. Eğer index ürün dizimizin boyutundan büyük olursa foreach döngüsü sonlanacaktır.

MoveNext() metodu bir sonraki elemana gidebiliyoruz cevabı geldiyese o elaman erişmemiz gerekiyor. Bu elemanlara erişmek ve işlem yapmak için Current özelliğini uygulamalıyız.

Neredeyse bitirdik. Reset() metodu ile ProductEnumerator sınıfımıza koleksiyonu ilk konuma getir demeliyiz. Şimdi bu metodu uygulayalım.

Burada tek yapmamız gereken index sayısını ilk hale getirmek yani -1 değerine getirmek. Enumerator sınıfımız artık hazır.

ProductEnumerator sınıfın son hali

ProductEnumerator geliştirmesini bitirdiğimize göre artık bu sınıfı ProductColleciton sınıfına bildirebiliriz. ProductCollection sınıfımıza artık sen elemanlar üzerinde işlem yapmak için ProductEnumerator sınıfını kullancaksın demiş oluyoruz.

Yaptıklarımızı özetleyecek olursak. ProductionCollection sınıfına IEnumerable arayüzünü uygulayarak foreach döngüsü ile iletişime geçmesini sağladık. ProductEnumerator sınıfına IEnumerator arayüzünü uygulayarak her bir elemana erişmek ve diğer işlemlerimizi yapma imkanı sağladık. ProductColleciton sınıfına ProductEnumerator kullan dedik.

Artık bu geliştirdiğimiz yapıyı test edebiliriz. Rastgele ürün nesnesi oluşturup koleksiyonumuza parametre olarak veriyoruz. Daha sonra foreach yapısı ile her bir elemanı ekrana yazdırıyoruz

Bu yazımızda IEnumerator ve IEnumerable arayüzlerini ele aldık ve işin mutfağında neler oluyor onu öğrenmeye çalıştık. Bu arayüzler sayesinde kendi yazdığımız koleksiyon tabanlı sınıflarımızda bulunan elemanlara erişebilir ve diğer işlemleri yapabiliriz. Son olarak her koleksiyon tabanlı sınıfın IEnumerable arayüzünü uyguladığı sonucu çıkarabiliriz.

Bir sonraki yazımda System.Collection isim alanında bulunan IDictionaryEnumerator arayüzünü ele alıp örnek bir uygulama ile pekiştiriyor olacağız.

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik

https://docs.microsoft.com/tr-tr/dotnet/api/system.collections.ienumerable?view=netframework-4.8

https://docs.microsoft.com/tr-tr/dotnet/api/system.collections.ienumerator?view=netframework-4.8

https://docs.microsoft.com/tr-tr/dotnet/csharp/programming-guide/concepts/collections

Leave a Comment