Foreach, Enumerable, IEnumerable,IEnumerator, yield operatörü

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.

 

Add comment

The file '/Custom/Widgets/Calendar/widget.cshtml' does not exist.The file '/Custom/Widgets/Category list/widget.cshtml' does not exist.The file '/Custom/Widgets/Tag cloud/widget.cshtml' does not exist.The file '/Custom/Widgets/Page List/widget.cshtml' does not exist.The file '/Custom/Widgets/Month List/widget.cshtml' does not exist.