Makale Özeti

System.Collection sınıfından türeyen bir sınıf ile çalışıyorsanız .Net içerisindeki bazı arayüzler (interface) size oldukça yardımcı olacaktır. Bu makalede IEnumerable, IEnumerator , IDictionary arayüzlerini inceleyeceğiz.

Makale

System.Collection sınıfından türeyen bir sınıf ile çalışıyorsanız .Net içerisindeki bazı arayüzler (interface) size oldukça yardımcı olacaktır. Bu makalede IEnumerable, IEnumerator , IDictionary arayüzlerini inceleyeceğiz.

IEnumerator

Bir koleksiyondaki elemanların tümüne bir numaralandırıcı aracılığıyla erişebilmek için o koleksiyonun GetEnumerator() metodundan yararlanırız. Bu metot sayesinde tüm elemanlara tek tek erişebilmemiz mümkündür. Yalnız GetEnumerator() metodunu kullanabilmemiz için IEnumerator ara yüzünden yararlanmamız gerekiyor. GetEnumerator()  methodunun sonucunu IEnumerator cinsinden bir değişkene aktarıp, mevcut methodları sayesinde işlem yapabiliriz.  Bir örnek verecek olursak:

  //ArrayList Oluşturuyoruz

  ArrayList listem = new ArrayList();

  //10 Adet Sayımızı ArrayList'e ekliyoruz

  for (int i = 0; i < 10; i++)

   {

        listem.Add(i);

   }

Buraya kadar yaptığımız işlem standart işlemlerdi. ArrayList’imiz içindeki elemanlara tek tek ulaşabilmemiz için şimdi IEnumerator arayüzünden yararlanacağız. ArrayList’imizin GetEnumerator methodu sayesinde verilere tek tek ulaşıcaz.

  //Koleksiyonun GetEnumerator() methodunu çağırarak koleksiyonun için bir numaralandırıcı elde ediyoruz

  IEnumerator listeleyici = listem.GetEnumerator();

ArrayList içerisindeki elemanlara listeleyici değişkeni sayesinde ulaşabilmemiz mümkün. MoveNext methodu False döndürene kadar tüm elemanlara ulaşabiliriz. Ulaştığımız elemanın değerini ise Current property’si sayesinde alabiliyoruz

  //Tek Tek Elemanları Alalım. MoveNext True döndüğü sürece döngü devam edecektir.

  while (listeleyici.MoveNext())

  {

        listBox1.Items.Add(listeleyici.Current.ToString());

  }

Burada akla şöyle bir soru geliyor. Biz bu yaptığımız işlemi fornext döngüsü ile yapamazmıydık ? Cevap evet yapabilirdik ama yukarıdaki örnek için yapabilirdik. Foreach ve IEnumerator arayüzü farkı sizin çalıştığınız koleksiyonlarda oraya çıkacaktır. Örneğin basit bir koleksiyon yapacak olursak ;

Ogrenci.cs 

public class Ogrenci

    {

        private string _ad;

        private string _soyad;

 

        public string Ad

        {

            get { return _ad; }

            set { _ad = value; }

        }

        public string Soyad

        {

            get { return _soyad; }

            set { _soyad = value; }

        }

    }

Ogrenciler.cs

 

public class Ogrenciler : CollectionBase

    {

       public void ListeyeEkle(Ogrenci value)

       {

           List.Add(value);

       }

    }

Yukarıda iki class yaptık. Bunlardan biri sadece property’lerin bulunduğu bir class, diğeri ise Ogrenciler isminde ogrenci bilgisi tutan ve CollectionBase sınıfından türetilmiş bir class. Ogrenciler sınıfında sadece tek bir method var ve bu method koleksiyona ekleme yapıyor. Koleksiyondaki mevcut elemanları nasıl görüntüleriz ? İşte bu noktada IEnumerator arayüzü karşımıza çıkıyor.

            Ogrenciler og = new Ogrenciler();

           for (int i = 1; i < 10; i++)

            {

                Ogrenci o = new Ogrenci();

                o.Ad = "Ogrenci " + i.ToString();

                o.Soyad = i.ToString();

                og.ListeyeEkle(o);

            }

             //Koleksiyonun GetEnumerator() methodunu çağırarak koleksiyonun başı için bir numaralandırıcı elde ediyoruz

             IEnumerator listeleyici = og.GetEnumerator();

             //Tek Tek Elemanları Alalım. MoveNext True döndüğü sürece döngü devam edecektir. Listeleyici.Current’i Ogrenci tipine döndürüp öğrencinin Ad’ı ekrana yazdırıyoruz

             while (listeleyici.MoveNext())

            {

                listBox1.Items.Add(((Ogrenci)listeleyici.Current).Ad);

            }

 

Gördüğünüz gibi ek bir method yazmadan Ogrenciler koleksiyonun GetEnumerator methodu sayesinde listeye ulaşabildik. Bizim yazdığımız sınıfta böyle bir method olmaması rağmen bu methodun nereden geldiğini inceleyelim.Mevcut Ogrenciler sınıfımız CollectionBase sınıfından türetildi . CollectionBase sınıfının tanımlamasına bakarsak ;

 public abstract class CollectionBase : IList, ICollection, IEnumerable

Bizi burada ilgilendiren arayüz IEnumerable arayüzüdür. Bu arayüz sayesinde IEnumerator arayüzüne veriler GetEnumerator methodu ile aktarılmaktadır. Başka bir değişle , IEnumerator arayüzü IEnumerable arayüzünden türeyen sınıflarda kullanılabilir.

IDictionaryEnumerator

Numaralandırıcı kullanmak istediğimiz koleksiyon key ve value bölümlerden oluşuyorsa ( örneğin koleksiyonumuz HashTable ise) bu değerlere de tek tek ulaşmak için IDictionaryEnumerator arayüzünden yararlanırız. IDictionaryEnumerator arayüzü IEnumerator’den katılım yolu ile türetilmiştir ve IEnumerator’den farklı olarak üç özelliğe sahiptir; Entry, Key ve Value.

Entry : Bir sonraki elemana kadar key/value çiftini tek seferde alır. Kendi içinde Key ve Value olarak iki özelliği bulunmaktadır. Aldığınız Entry’nin özelliklerine ulaşabilirsiniz 

Key : Alınan mevcut Entry’nin anahtar değerini vermektedir.

Value : Alınan mevcut Entry’nin value değerini vermektedir.

IDictionaryEnumerator ile ilgili bir örnek yaparak devam edelim :

//Hastable oluşturuyoruz

Hashtable listem = new Hashtable();

//Oluşturduğumuz Hashtable içine Anahtarları ve Değerleri giriyoruz

 for (int i = 0; i < 10; i++)

   {

         listem.Add("Anahtar " + i, "Deger " + i);

   }

  /* Koleksiyonun GetEnumerator() methodunu çağırarak hashtable

   * için bir numaralandırıcı elde ediyoruz.Bir önceki örnekte IEnumerator kullanmıştık

   * bu sefer IDictionaryEnumerator kullanıyoruz

   */

    IDictionaryEnumerator listeleyici = listem.GetEnumerator();

   //Tek Tek Elemanları Alalım

   while (listeleyici.MoveNext())

        {

          listBox1.Items.Add(listeleyici.Entry.Key + " ; " + listeleyici.Entry.Value);

        }

Yaptığımızı özetleyecek olursak, ilk önce bir HashTable oluşturduk (listem). Daha sonra listem koleksiyonuna anahtar ve değer olacak şelikde 0’dan 9’a kadar değerler ekledik. Mevcut koleksiyon içerisindeki elemanlara numaralandırıcı yardımıyla erişmek istediğimiz için IDictionaryEnumerator arayüzünden yararlandık ve koleksiyon için bir numaralandırıcı oluşturduk. Daha sonra IDictionaryEnumerator arayüzünün MoveNext() metodundan yararlandık , bu metot true döndüğü sürece Entry.Key özelliği bize okunan anahtarı, Entry.Value ise değeri vermektedir.

Bir başka makalede görüşmek üzere

 

Okan Tekeli

okan.tekeli@bilgeadam.com

okan@okantekeli.com