Předtím, než skočíme do rozdílu mezi IEnumerable a IEnumerator, nejprve si vysvětlíme pojmy Enumerator a Enumerable a kdy a proč je používat.
Enumerable je modul používaný ve třídě Array, který vám dává Enumerator. Samotná třída není každá metoda. Ve skutečnosti používá metodu nazvanou 'GetEnumerator', která vám dává Enumerator k načtení její položky.
Enumerátor je objekt, který vrací každou položku v kolekci v určitém pořadí, přesně tak, jak jsou požadovány. Kompilátor generuje kód, který používá Enumerator, když píšete smyčku foreach v C #.
IEnumerator je rozhraní implementované enumerátorem a enumerovatelná třída implementuje IEnumerable rozhraní.
IEnumerable je základní rozhraní používané k získání objektu, který umí enumerovat (nebo iterovat) přes prvky v kolekci.
Je to implementace iterátorového vzoru, který poskytuje mechanismus pro procházení objektu ve sbírce bez ohledu na jeho vnitřní strukturu. Rozhraní IEnumerable představuje objekt, který lze iterovat v kolekci.
Používá pouze jednu metodu „GetEnumerator“, která vrací instanci třídy enumerator, která implementuje rozhraní IEnumerator.
Rozhraní IEnumerator na druhé straně deklaruje dvě metody - Reset () a MoveNext () - a jednu vlastnost, Current. MoveNext () vrací booleovskou hodnotu, která označuje konec seznamu a pomáhá umístit první prvek v seznamu po vyvolání metody Reset () - nastaví enumerátor do výchozí polohy, aby znovu opakoval seznam ze seznamu začátek.
Vlastnost Current lze vyvolat pouze prostřednictvím instance rozhraní IEnumerator a vrací aktuální prvek v seznamu.
IEnumerable i IEnumerator jsou rozhraní, která společně implementují vzorový návrh softwaru iterátoru v rozhraní .Net Framework. NET Framework umožňuje přístup k jednotlivým prvkům ve vlastní kolekci při implementaci rozhraní IEnumerable a IEnumerator. Rozhraní IEnumerable deklaruje pouze jednu metodu nazvanou GetEnumerator, která vrací jiný typ rozhraní nazvaného rozhraní IEnumerator pro danou kolekci. IEnumerator je naproti tomu základní rozhraní pro všechny ne-generické enumerátory, které se používají ke čtení dat ve sbírce. Výčty však nelze použít k úpravě podkladové kolekce.
Rozhraní IEnumerable definuje pouze jednu metodu GetEnumerator (), což je metoda instance používaná na několika různých typech kolekce. Získá iterátor IEnumerator, který lze použít k iteraci všech hodnot z kolekce. Při psaní smyčky foreach v C # kód, který generuje, volá metodu GetEnumerator k vytvoření čítače používaného smyčkou.
Naproti tomu IEnumerator používá dvě metody MoveNext () a Reset () a vlastnost Current. Metoda MoveNext () přivede čítače na další prvek kolekce, zatímco metoda Reset () nastaví čítače do výchozí polohy, která je před prvním prvkem v kolekci..
IEnumerable je obecné rozhraní, které poskytuje abstrakci pro opakování prvků a implementací rozhraní IEnumerable generická třída v podstatě umožňuje iteraci přes rozhraní IEnumerator. Přitom tyto třídy poskytnou společné rozhraní pro načtení instance objektu IEnumerator, který podporuje všechny základní sady navigačních metod.
IEnumerator je základní rozhraní pro enumerátory a použití IEnumerable rozhraní vyžaduje, aby třída implementovala IEnumerator. Obě rozhraní je třeba implementovat, pokud chcete poskytnout podporu foreach. Abstraktní třída 'AbstractEnumerator' implementuje rozhraní IEnumerator.
Rozhraní IEnumerable spolu s podporou rozhraní IEnumerator umožňuje iterovat prvky v zásobníku pomocí příkazu 'foreach'. Je to základní rozhraní používané pro objekty typu kolekce. Iterace začíná horním prvkem v zásobníku a končí nejstarším prvkem v zásobníku. Jednoduše řečeno, představuje objekt, který lze vyjmenovat.
Spolu s rozhraním IEnumerator umožňují, aby prvky ArrayList byly iterovány standardizovaným sekvenčním způsobem, počínaje prvním prvkem a dále. Příkaz foreach používá metody a vlastnosti rozhraní IEnumerator k iteraci všech prvků v kolekci.
Stručně řečeno, jak IEnumerable, tak IEnumerator jsou rozhraní používaná k výčtu nebo iteraci třídy, která má charakter kolekce, což znamená, že usnadňují iterativní přístup ve vlastní kolekci. IEnumerable je obecné rozhraní dostupné pro objekty typu kolekce a implementací rozhraní IEnumerable generická třída v podstatě umožňuje iteraci přes rozhraní IEnumerator. Používá pouze jednu metodu GetEnumerator, která vrací instanci třídy enumerator implementující rozhraní IEnumerator. Rozhraní IEnumerator je určeno k použití jako přístupové a nelze jej použít k úpravě podkladové kolekce. Poskytuje dvě abstraktní metody Reset () a MoveNext () a vlastnost Current pro vyvolání určitého prvku v kolekci.