Gibi Degerleri Vermek Zorundayiz.döngünün liste icerisinde
hareket edebilmesi ve tüm elemanlari sırasi ile elde edebilmek icin.
foreach
(string item in
Elemanlar)
{
AnlikDeger = item;
}
Evet foreach yapısına bakıyoruz.
Foreach Benden sadece
hangi liste icerisinde dönmegi gerektigini yani hedefi istiyor.Geri kalani
baslangic Degeri,Artis Miktari,Karar Mekanizmasi gibi özellikleri IEnumerable
ve IEnumerator Interface’leri sağlıyor.
İste
bahsetmiş oldugmuz durum’da bu ya. Liste yapıları IEnumerable ve IEnumerator’den
implements edilerek oluşturuluyor. Yani bu yapı kendi içerisinde iterasyon yani
hareket kabiliyeti oluşturuyor. Foreach bu yapıyı kullanarak çok rahat bir şekilde
liste elemanları içerisinde hareket ederek bizlere bilgileri ulaştırabiliyor.
Kendi
tiplerimiz ile olusturdugmuz listeleride IEnumerable ve IEnumerator
Interface’lerden implements edersek Foreach yapısına kucak açmış oluruz.
Simdi
örnek yapılara geçerek bu işi daha iyi bir şekilde çözebiliriz.
public class Personel
{
public string Ad { get; set; }
public string Soyad { get; set; }
public Personel() { }
public Personel(string
ad, string soyad)
{
this.Ad = ad;
this.Soyad = soyad;
}
}
------------------------------------------
public class PersoneList
{
List<Personel>
list = new List<Personel>();
public void Ekle(Personel p)
{
list.Add(p);
}
public void Ekle(string ad, string
soyad)
{
list.Add(new Personel(ad,
soyad));
}
}
------------------------------------------
PersoneList list = new PersoneList();
list.Ekle("Sinan", "BARAN");
list.Ekle("Ibrahim", "BARAN");
list.Ekle("Murat", "BARAN");
list.Ekle("Ramazan", "BARAN");
list.Ekle("Muharrem", "BARAN");
list.Ekle("Aydın", "BARAN");
list.Ekle("Fatih", "BARAN");
list.Ekle("Gokhan", "BARAN");
list.Ekle("Hakan", "BARAN");
foreach (Personel item in list)
{
listBox1.Items.Add(item.Ad + " "
+ item.Soyad);
}
Evet Bu
yapi Kullanilmak istendiginde bana direk olarak hareket edebilecek alan
bilgilerinin olmadigini bildirecek GetEnumerator()
O yuzden PersonelList yapisini IEnumerable
yapı ile implements edeceğim.
public class PersoneList : IEnumerable
{
List<Personel>
list = new List<Personel>();
public void Ekle(Personel p)
{
list.Add(p);
}
public void Ekle(string ad, string soyad)
{
list.Add(new Personel(ad,
soyad));
}
public IEnumerator
GetEnumerator()
{
return new PersonelEnumerator(list);
}
}
Daha Sonra Ienumerator Interface yapısını kullanan yani
hareket kabiliyeti sunan Interface Yapısı Ienumerator
public class
PersonelEnumerator : IEnumerator
{
public List<Personel> listem = new
List<Personel>();
int CurrentLocation = -1;
public PersonelEnumerator(List<Personel> p)
{
this.listem = p;
}
public object Current
{
get
{
return this.listem[CurrentLocation];
}
}
public bool
MoveNext()
{
CurrentLocation++;
return (CurrentLocation < this.listem.Count);
}
public void Reset()
{
CurrentLocation = -1;
}
}
Evet Ornek yapiyi indirebilir daha iyi bir sekilde irdeliyebilirsiniz.Yield Kullanimi ise Ienumerator Interface’sine ihtiyac
duymaksizin benim iterasyonu sagliyan bir yapi
List<Personel> list = new List<Personel>();
public void Ekle(Personel p)
{
list.Add(p);
}
public void Ekle(string ad, string soyad)
{
list.Add(new Personel(ad,
soyad));
}
public IEnumerator
GetEnumerator()
{
foreach (Personel
item in list)
{
yield return item;
}
}
Döngü her geldiginde kaldigi yerden devam ediyor.Aslinda
Ienumerator yapısına göre daha performanslı bir özelliktir.Tabi Mekanizma
icerisinde fazladan kontrol yapmıyacaksan.