Zanim wskoczymy w różnicę między IEnumerable i IEnumerator, najpierw zrozummy pojęcia Enumerator i Enumerable oraz kiedy i dlaczego ich używać.

Enumerable to moduł używany w klasie Array, który daje ci Enumerator. Sama klasa nie ma każdej metody. W rzeczywistości używa metody o nazwie „GetEnumerator”, która daje ci Enumerator, aby pobrać jego element.

Enumerator to obiekt, który zwraca każdy element w kolekcji w określonej kolejności, dokładnie tak, jak są one żądane. Kompilator generuje kod, który używa Enumeratora, gdy piszesz pętlę foreach w C#.





IEnumerator to interfejs implementowany przez enumerator, a klasa enumerable implementuje interfejs IEnumerable.

Co to jest Ienumerable?

IEnumerable to podstawowy interfejs używany do uzyskania obiektu, który wie, jak wyliczyć (lub iterować) nad elementami w kolekcji.



Jest to implementacja wzorca iteratora, który zapewnia mechanizm przemierzania obiektu w kolekcji niezależnie od jego wewnętrznej struktury. Interfejs IEnumerable reprezentuje obiekt, który może być iterowany w kolekcji.

Używa tylko jednej metody „GetEnumerator”, która zwraca instancję klasy enumeratora, która implementuje interfejs IEnumerator.



Czym jest Ienumerator?

Interfejs IEnumerator, z drugiej strony, deklaruje dwie metody – Reset ( ) i MoveNext ( ) – oraz jedną właściwość, Current. MoveNext ( ) zwraca wartość Boolean, która wskazuje koniec listy i pomaga pozycjonować pierwszy element na liście po wywołaniu metody Reset ( ) – ustawia enumerator na jego domyślną pozycję, aby ponownie powtórzyć listę od początku.

Właściwość Current może być wywołana tylko przez instancję interfejsu IEnumerator i zwraca bieżący element na liście.



Różnica pomiędzy IEnumerable a IEnumerator

Podstawy IEnumerable i Ienumerator

Zarówno IEnumerable, jak i IEnumerator są interfejsami, które wspólnie implementują wzorzec projektowy oprogramowania iteratora w .Net Framework. The .Net Framework sprawia, że dostęp do poszczególnych elementów w kolekcji niestandardowej podczas implementacji interfejsów IEnumerable i IEnumerator. Interfejs IEnumerable deklaruje tylko jedną metodę o nazwie GetEnumerator, która zwraca inny typ interfejsu o nazwie IEnumerator dla tej konkretnej kolekcji. IEnumerator natomiast jest interfejsem bazowym dla wszystkich nie-generycznych enumeratorów, które są używane do odczytywania danych w kolekcji. Jednak enumeratory nie mogą być używane do modyfikowania kolekcji bazowej.

Metody

Interfejs IEnumerable definiuje tylko jedną metodę GetEnumerator ( ), która jest metodą instancji używaną na kilku różnych typach kolekcji. Otrzymuje iterator IEnumerator, który może być użyty do iteracji nad wszystkimi wartościami z kolekcji. Kiedy piszesz pętlę foreach w C#, kod, który generuje, wywołuje metodę GetEnumerator, aby utworzyć Enumerator używany przez pętlę.



IEnumerator natomiast używa dwóch metod MoveNext ( ) i Reset ( ) oraz właściwości Current. Metoda MoveNext ( ) przenosi enumerator na następny element kolekcji, natomiast metoda Reset ( ) ustawia enumerator na jego domyślną pozycję, która znajduje się przed pierwszym elementem kolekcji.

Implementacja

IEnumerable to ogólny interfejs, który zapewnia abstrakcję dla pętli nad elementami, a poprzez implementację interfejsu IEnumerable klasa generyczna zasadniczo umożliwia iterację za pośrednictwem interfejsu IEnumerator. W ten sposób klasy te kończą dostarczanie wspólnego interfejsu do pobierania instancji obiektu IEnumerator, który obsługuje wszystkie podstawowe zestawy metod nawigacyjnych.

IEnumerator jest interfejsem bazowym dla enumeratorów, a użycie interfejsu IEnumerable wymaga, aby klasa implementowała IEnumerator. Oba interfejsy muszą być zaimplementowane, jeśli chcesz zapewnić wsparcie dla foreach. Klasa abstrakcyjna „AbstractEnumerator” implementuje interfejs IEnumerator.

Funkcjonalność IEnumerable i IEnumerator

Interfejs IEnumerable wraz z obsługującym go interfejsem IEnumerator pozwala na iterację po elementach na stosie za pomocą instrukcji 'foreach’. Jest to podstawowy interfejs używany dla obiektów typu kolekcja. Iteracja rozpoczyna się od najwyższego elementu stosu i kończy się na najstarszym elemencie stosu. Mówiąc najprościej, reprezentuje obiekt, który może być wyliczony.



Wraz z interfejsem IEnumerator umożliwiają iterację elementów ArrayList w standardowy, sekwencyjny sposób, zaczynając od pierwszego elementu i idąc do przodu. Instrukcja foreach wykorzystuje metody i właściwości interfejsu IEnumerator do iteracji wszystkich elementów w kolekcji.

Podsumowanie IEnumerable kontra IEnumerator

W skrócie, zarówno IEnumerable jak i IEnumerator są interfejsami używanymi do wyliczania lub iteracji klasy, która ma charakter kolekcji, co oznacza, że ułatwiają iteracyjny dostęp w niestandardowej kolekcji. IEnumerable jest ogólnym interfejsem dostępnym dla obiektów typu kolekcji i poprzez implementację interfejsu IEnumerable, klasa generyczna zasadniczo umożliwia iterację poprzez interfejs IEnumerator. Używa tylko jednej metody GetEnumerator, która zwraca instancję klasy enumeratora, która implementuje interfejs IEnumerator. Interfejs IEnumerator ma być używany jako accessory i nie może być używany do modyfikowania kolekcji bazowej. Zapewnia dwie abstrakcyjne metody Reset ( ) i MoveNext ( ) oraz właściwość Current do wywoływania konkretnego elementu w kolekcji.