IEnumerable ve IEnumerator arasındaki farka gitmeden önce, öncelikle Enumerator ve Enumerable terimlerini ve bunları ne zaman ve neden kullanacağımızı anlayalım..
Enumerable Array sınıfında kullanılan ve size Enumerator sağlayan bir modüldür. Sınıfın kendisi her yöntemi değil. Aslında, 'GetEnumerator' adlı bir yöntem kullanarak size bir Enumerator öğesini almanızı sağlar.
Numaralandırıcı, bir koleksiyondaki her öğeyi tam olarak istendiği gibi belirli bir sırada döndüren bir nesnedir. C # 'da bir foreach döngüsü yazdığınızda, derleyici bir Enumerator kullanan kod üretir.
IEnumerator bir numaralandırıcı tarafından uygulanan bir arabirimdir ve numaralandırılabilir sınıf IEnumerable arabirimini uygular.
IEnumerable, koleksiyondaki öğeler üzerinde nasıl numaralandırılacağını (veya yineleneceğini) bilen bir nesneyi elde etmek için kullanılan temel bir arabirimdir.
İç yapısından bağımsız olarak koleksiyondaki bir nesneyi hareket ettirmek için bir mekanizma sağlayan yineleyici deseninin bir uygulamasıdır. IEnumerable arabirimi bir koleksiyonda yinelenebilen bir nesneyi temsil eder.
IEnumerator arabirimini uygulayan bir numaralandırıcı sınıfı örneği döndüren yalnızca bir "GetEnumerator" yöntemi kullanır.
IEnumerator arabirimi, diğer yandan, iki yöntem bildirir - Reset () ve MoveNext () - ve bir özellik, Current. MoveNext (), listenin sonunu gösteren ve Reset () yöntemini çağırdıktan sonra listedeki ilk öğeyi konumlandırmaya yardımcı olan bir Boolean vale döndürür - listeyi listeden tekrarlamak için numaralandırıcıyı varsayılan konumuna ayarlar başlangıç.
Current özelliği yalnızca IEnumerator arabiriminin bir örneği aracılığıyla çağrılabilir ve listedeki geçerli öğeyi döndürür.
Hem IEnumerable hem de IEnumerator, .Net Framework içindeki yineleyici yazılım tasarım desenini birlikte uygulayan arabirimlerdir. .Net Framework, IEnumerable ve IEnumerator arabirimlerini uygularken özel koleksiyondaki öğelere tek tek erişmeyi sağlar. IEnumerable arabirimi, GetEnumerator adlı yalnızca bir yöntem bildirir; bu, söz konusu koleksiyon için IEnumerator arabirimi adı verilen başka bir arabirim türü döndürür. IEnumerator ise, koleksiyondaki verileri okumak için kullanılan tüm jenerik olmayan sayıcılar için temel arabirimdir. Ancak, numaralandırıcılar temeldeki koleksiyonu değiştirmek için kullanılamaz.
IEnumerable arabirimi, birkaç farklı toplama türünde kullanılan bir örnek yöntem olan yalnızca bir yöntem GetEnumerator () tanımlar. Koleksiyondaki tüm değerleri yinelemek için kullanılabilecek bir IEnumerator yineleyicisi alır. C # 'da bir foreach döngüsü yazdığınızda, oluşturduğu kod döngü tarafından kullanılan Enumerator'ı oluşturmak için GetEnumerator yöntemini çağırır.
IEnumerator ise, MoveNext () ve Reset () yöntemlerini ve Current özelliğini kullanır. MoveNext () yöntemi, numaralandırıcıyı koleksiyonun bir sonraki öğesine alırken Reset () yöntemi, numaralandırıcıyı koleksiyondaki ilk öğeden önceki varsayılan konumuna ayarlar.
IEnumerable, öğeler üzerinde döngü için bir soyutlama sağlayan ve IEnumerable arabirimini uygulayarak, genel bir sınıf temelde IEnumerator arabirimi üzerinden yinelemeyi sağlar. Bunu yaparken, bu sınıflar, tüm temel gezinme yöntemleri kümesini destekleyen bir IEnumerator nesnesinin bir örneğini almak için ortak bir arabirim sağlar..
IEnumerator, numaralandırıcılar için temel arabirimdir ve IEnumerable arabiriminin kullanılması, sınıfın IEnumerator uygulamasını uygulamasını gerektirir. Foreach için destek sağlamak istiyorsanız her iki arabirimin de uygulanması gerekir. Soyut sınıf 'AbstractEnumerator' IEnumerator arabirimini uygular.
IEnumerable arabirimi, destekleyici IEnumerator arabirimi ile birlikte, 'foreach' deyimini kullanarak destedeki öğeleri yinelemenize olanak tanır. Koleksiyon tipi nesneler için kullanılan temel arayüzdür. Yineleme, yığındaki üst öğeyle başlar ve yığındaki en eski öğeyle biter. Basitçe söylemek gerekirse, numaralandırılabilecek bir nesneyi temsil eder.
IEnumerator arabirimi ile birlikte, ArrayList öğelerinin, ilk öğeden başlayıp ileriye doğru standart, sıralı bir şekilde yinelenmesini sağlarlar. Foreach deyimi, bir koleksiyondaki tüm öğeleri yinelemek için IEnumerator arabiriminin yöntemlerini ve özelliklerini kullanır.
Özetle, hem IEnumerable hem de IEnumerator, toplama niteliğine sahip bir sınıfı numaralandırmak veya yinelemek için kullanılan, özel bir koleksiyonda yinelemeli erişimi kolaylaştırdıkları arabirimlerdir. IEnumerable, toplama türü nesneler için kullanılabilir genel arabirimdir ve IEnumerable arabirimini uygulayarak, genel bir sınıf temelde IEnumerator arabirimi üzerinden yinelemeyi sağlar. IEnumerator arabirimini uygulayan bir numaralandırıcı sınıfı örneği döndüren yalnızca bir yöntem GetEnumerator kullanır. IEnumerator arabirimi erişimci olarak kullanılmak üzere tasarlanmıştır ve temel alınan koleksiyonu değiştirmek için kullanılamaz. Bir koleksiyondaki belirli bir öğeyi çağırmak için iki soyut yöntem Reset () ve MoveNext () ve Current özelliği sağlar.