IEnumerator Arayüzü:

System.Collections isimalanı içinde bulunan bu arayüz Iteator işlemleri yapmamızı sağıyor. Bunu kendimiz de yapamaz mıyız ? tabi ki yaparız. Ama belli başlı sınıflar ya da kullanımlar bizden IEnumarator ya da IEnumarable arayüzüne sahip sınıflardan türetilmiş elemanlar ister bu yüzden iterator işlemlerimiz için kendi yapımızı kullanmak yerine IEnumarator ve IEnumarable arayuzlerini implment edersek genel geçer bir yapımız olur.
Bu yapıyı şunlara benzetebiliriz.
Foreach
PHP’de db result fetching olayları.
.Netciler de zaten .GetEnumartor() metorlarını çokça kullanmışlardır.
Neden MovePrev yok derseniz onu da makaleyi okuduktan sonra eklersiniz. sınıflarımıza (:.
IEnumerable Arayüzü:

Tek metod (GetEnumarator) isteyen bu arayüz bir iterator olmanız yerine sizden iterator gorebi gorebilecek bir dongu de alabilir. Bu da cok işimize yarayabilecek ozelliklerden biridir. Hemen bir IEnumarator dönderebilen Sınıf implement ediip geçmeden önce yield return’dan bahsederlim
Yield Return:

IEnumarator dönüş tipi olan bir fonksiyon (Örn: GetEnumarator()) birden fazla elemanın ard arda dönebileceğini düşünün. Ki zaten .nett te Enumarator yapısı bunun üzerine kurulmuştur. IEnumarator yapısıyla dönecek elemanın tipi de belirlenebiliniyor. Bu da bizi Current elamanının type casting olayından kurtarıyor. IEnumarator dönüş tipinizse yield return ile birden fazla eleman döndürüp bunu da GetEnumarator() dye tanımlayabilirsiiz bunları yapmışken IEnumarable arayüzünden implement ederseniz yine bazı standartlara uymuş olursunuz.
Şimdi hem IEnumarable türüne örnek yazalım hem de yield return kullanımına örnek göstereelim.

Örnek sınıfımız artık bize bir numarator verebiliyor.
Ve bu kullanıma artık müsait. Tabi ki kullanımız bu kadar basit olmayacaktır ancak örnek olması açısından düşünülebilir. Bu verilerin bize belli bir kaynaktan geldiğini varsayalım yine hiç bir şey değişmeyecek ve kaynağımızdan alma sırasına göre numratatore gonderebileceğiz. Örnek sınıfımızı hiç bozmadan buna örnek vermek istersek.

Yield return anında bir kırılma olabilir mi ? return olsaydı olurdu anca debug anında şoyle bir şey gözlemledim. Numarator alan fonksiyon ya metodlar beraberinde üretim fonksiyonununda ismini taşıyor “GetEnumaratıor” tahminimce kaldığı yeri de burdan biliyor
IEnumarator<T> Arayüzü:

Kendi tiplerimize iterate ozelliği kazandırabilir miyiz. .NET in En sevdiğimiz yapılarından olan Generic Collections bize bura da Numaratorleri object türünden değil de kendi tiplerimizde kullanma şansı veriyor. LINQ içinde from eleman in elemanlar dediğimizde eleman tipini tanıması generic collectionslarda tipin zaten tanımlanıyor olmasıdır. Biz de numaratorlerimizde YazilimciNumarator.Current deiğimizde cast ihtiyacı duymadan . tipine uygun metodları ya da propertyleri kullanabilmemiz için Enumarator arayüzüne de sahip bu arayüzü kullanmalıyız bir yazılımcı sınıfı yazıp numaratore ornek verelim.

IEnumarable<T> Arayüzü:

IEnumarable Arayüzü ile aynı olan bu arayüz GetEnumarator metodunu ezerek buna bir de tip tanınlanmış olan IEnumarator tipinde bir Generic dönderir. Yine bu metodu biz yazacağız.
Yazılımcı listesini yine bir “yield return” örneğiyle kısaca anlatalım.

Artık tipimiz de belliyse şimdi numarator gibi kullanırken”Current” bize “Yazilimci” gibi davranabilecek davranmaktan ziyade tipi zaten Yazilimci olacaktır fakat bunu cast etme ihtiyacı duymadan kullanabileceğiz.

Makaleyi pdf formatta isterseniz
IEnumarable ve IEnumarator.pdf
iyi çalışmalar..