Bu makalemizde Foreach, yield, IEnumerable, IEnumerator deyimlerin derinlemesine kod yazarak inceleyeceğiz. Fakat ben yine anlatımlara, sonradan ilave edtme düşüncesiyle özet olarak geçeceğim.
static void Main(string[] args)
{
string[] Listem = new string[] { "ali", "ahmet", "mehmet" };
IEnumerable<string> elemanlar = Listem;
foreach (string eleman in elemanlar)
{
Console.WriteLine(eleman);
}
//veya
foreach (string eleman in Listem)
{
Console.WriteLine(eleman);
}
//görüleceği her iki dongu aynı şeyi yapar.
//çünkü elemanlar nesnesiArray bir tiptir elemanlar nesnesi. ve Array sınıfı
//Array sınıfıda IEnumerable arabiriminden kalıtım almıştır.
Console.WriteLine(elemanlar.GetType().BaseType.ToString());
}
}
Şimdi bir ürün ve sepet classları yazalım ve bunu foreach ile sayacak hale getirelim.
using System;
using System.Collections;
using System.Collections.Generic;
namespace deneme
{
class Program
{
static void Main(string[] args)
{
Sepet urunler = new Sepet();
foreach (Urun urn in urunler)
{
Console.WriteLine(urn.Ad);
}
//while kullanarak da bunu listeleyebilirim.
IEnumerator sepetim = urunler.GetEnumerator();
//UrunNumeratorlu sepetim1 = urunler.GetEnumerator() as UrunNumeratorlu;
while (sepetim.MoveNext())
{
Urun urunum = (Urun)sepetim.Current;
Console.WriteLine(urunum.Ad);
}
}
}
class Sepet : IEnumerable
{
private Urun[] _urunSepeti;
public Urun[] UrunSepeti
{
get { return _urunSepeti; }
set { _urunSepeti = value; }
}
public Sepet()
{
UrunSepeti = new Urun[]
{
new Urun(1, "elma"),
new Urun(2, "portakal"),
new Urun(3, "Muz"),
new Urun(4, "Kiraz")
};
}
public IEnumerator GetEnumerator()
{
return new UrunNumeratorlu(_urunSepeti);
}
}
class Urun
{
private int _id;
private string _ad;
public int Id
{
get { return _id; }
set { _id = value; }
}
public string Ad
{
get { return _ad; }
set { _ad = value; }
}
public Urun(int id, string ad)
{
Id = id;
Ad = ad;
}
}
class UrunNumeratorlu : IEnumerator
{
private Urun[] _Urunler;
int _index;
public UrunNumeratorlu(Urun[] urunler)
{
_Urunler = urunler;
Reset();
}
public object Current
{
get { return _Urunler[_index]; }
}
public bool MoveNext()
{
return ++_index < _Urunler.Length;
}
public void Reset()
{
_index = -1;
}
}
}
Şimdi de UrunNumeratorlu bir sınıf yazmamıza gerek kalmadan yield operatorunu kullaran da aynı şeyi yapabiliriz. Adeta Enumarator için yazılmış bir deyimdir.
public IEnumerator GetEnumerator()
{
for (int i = 0; i < UrunSepeti.Length; i++)
yield return UrunSepeti[i];
}
Artık bu satırdan sonra UrunNumeratorlu clasına yapmaya gerek kalmadı. Yield operatörünü açıklayan bir örnek daha yapalım.z
class Program
{
static void Main(string[] args)
{
foreach (int item in Tekler(3,19))
{
Console.WriteLine(item);
}
}
static IEnumerable Tekler(int x, int y)
{
for (int i = x; i < y; )
{
i += 2;
yield return i;
}
}
}
Ekran çıktısı 5-19 arasındaki tek sayılar olacaktır. Şİmdi son bir örnek yapalım. msdn.com adresinden biraz alıp, düzenlediğim bir örnekle makalemizi noktalayalım.
using System;
using System.Collections;
using System.Collections.Generic;
namespace deneme
{
class Program
{
static void Main(string[] args)
{
var urunler = new Urunler();
foreach(Urun urun in urunler.SonrakiUrun)
{
Console.WriteLine(urun.Ad);
}
}
}
public class Urun
{
public int Id { get;set;}
public string Ad { get ; set; }
}
public class Urunler
{
public IEnumerable<Urun> SonrakiUrun
{
get
{
yield return new Urun { Id = 1, Ad = "elma" };
yield return new Urun {Id=2,Ad= "armut"};
yield return new Urun {Id=3,Ad= "çilek"};
yield return new Urun {Id=4,Ad= "kiraz"};
}
}
}
}
Şimdi de gereric IEnumerable<T> gereic arabiriminden kalıtım aldıralım.
namespace generic
{
class Program
{
static void Main(string[] args)
{
Sepet sepet = new Sepet();
foreach (var item in sepet)
{
Console.WriteLine(item.Ad);
}
}
}
class Urun
{
public int id { get; set; }
public string Ad { get; set; }
public double Fiyat { get; set; }
}
class Sepet :IEnumerable<Urun>
{
Urun[] urunler;
public Sepet()
{
urunler = new Urun[] {
new Urun{ Ad="elma", Fiyat=45, id=1},
new Urun{ Ad="potiş", Fiyat=15, id=2},
new Urun{ Ad="ssss", Fiyat=25, id=1}
};
}
public IEnumerator<Urun> GetEnumerator()
{
for (int i = 0; i <urunler.Length; i++)
{
yield return urunler[i];
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
}
Bir sonraki yazımızda görüşmek üzere.