17 Eylül 2018

IEnumerator ve yield kullanımı

IEnumerator ile tekrar eden basit yığınlar üzerinde işlemler yapılır. Yığın içerisinde MoveNext() ile dönen değeri alırız. Eğer dönen değer True ise bir adım ilerlemiştir. Ve bulunduğu adımdaki değeri Current ile alırız. Eğer değer False ise bir sonraki adımı okumamıştır. Yığın içerisinde ki adım bitmiştir. yield anahtarı ile işlemin bitmesini beklemeden her adımı göndeririz. Bu bize tüm işlemlerin bitmeden çalışmamızı sağlar. Aşağıda ki örneğe dikkat ederseniz uzun işleme girmeden önce her adımı teker teker yollamıştır.
using System;
using System.Collections.Generic;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var g = Metod();
            while (g.MoveNext())
            {
                Console.WriteLine(g.Current);
            }                    
        }

        static IEnumerator<int> Metod()
        {
            yield return 1;
            yield return 2;
            Console.WriteLine("Uzun işlem başlangıç");
            System.Threading.Thread.Sleep(5000);
            Console.WriteLine("Uzun işlem bitiş");
            yield return 3;
        }
    }
}