Różnica między IEnumerable i IEnumerator

Zanim przejdziemy do różnicy między IEnumerable i IEnumerator, najpierw zrozummy terminy Enumerator i Enumerable oraz kiedy i dlaczego ich używać.

Enumerable to moduł używany w klasie Array, który daje Enumerator. Sama klasa nie ma każdej metody. W rzeczywistości używa metody o nazwie „GetEnumerator”, która daje moduł wyliczający do odzyskania jego elementu.

Moduł wyliczający to obiekt, który zwraca każdy element w kolekcji w określonej kolejności, dokładnie tak, jak są wymagane. Kompilator generuje kod korzystający z modułu wyliczającego podczas pisania pętli foreach w języku C #.

IEnumerator to interfejs implementowany przez moduł wyliczający, a klasa enumerable implementuje interfejs IEnumerable.

Co jest niezliczone?

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

Jest to implementacja wzorca iteratora, który zapewnia mechanizm przechodzenia przez obiekt w kolekcji niezależnie od jego wewnętrznej struktury. Interfejs IEnumerable reprezentuje obiekt, który można iterować w kolekcji.

Używa tylko jednej metody „GetEnumerator”, która zwraca instancję klasy modułu wyliczającego, która implementuje interfejs IEnumerator.

Co to jest Ienumerator?

Z drugiej strony interfejs IEnumerator deklaruje dwie metody - Reset () i MoveNext () - oraz jedną właściwość, Current. MoveNext () zwraca wartość logiczną, która wskazuje koniec listy i pomaga w ustawieniu pierwszego elementu na liście po wywołaniu metody Reset () - ustawia moduł wyliczający na pozycję domyślną, aby ponownie iterować listę z początek.

Właściwość Current można wywołać tylko za pośrednictwem instancji interfejsu IEnumerator i zwraca bieżący element na liście.

Różnica między IEnumerable i IEnumerator

Podstawy IEnumerable i Ienumerator

Zarówno IEnumerable, jak i IEnumerator to interfejsy, które razem implementują wzorzec projektowania oprogramowania iteratora w .NET Framework. .NET Framework umożliwia 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 interfejs IEnumerator dla tej konkretnej kolekcji. Z drugiej strony IEnumerator jest interfejsem podstawowym dla wszystkich nietypowych modułów wyliczających, które są używane do odczytu danych w kolekcji. Nie można jednak użyć modułów wyliczających do zmodyfikowania podstawowej kolekcji.

Metody

Interfejs IEnumerable definiuje tylko jedną metodę GetEnumerator (), która jest metodą instancji stosowaną w kilku różnych typach kolekcji. Pobiera iterator IEnumerator, którego można używać do iteracji wszystkich wartości z kolekcji. Podczas pisania pętli foreach w języku C # generowany przez nią kod wywołuje metodę GetEnumerator w celu utworzenia modułu wyliczającego używanego przez pętlę.

Z kolei IEnumerator używa dwóch metod MoveNext () i Reset () oraz właściwości Current. Metoda MoveNext () przenosi moduł wyliczający do następnego elementu kolekcji, podczas gdy metoda Reset () ustawia moduł wyliczający na pozycję domyślną, która znajduje się przed pierwszym elementem w kolekcji.

Realizacja

IEnumerable to ogólny interfejs, który zapewnia abstrakcję do zapętlania elementów, a poprzez implementację interfejsu IEnumerable klasa ogólna zasadniczo umożliwia iterację poprzez interfejs IEnumerator. W ten sposób klasy te zapewniają wspólny interfejs do pobierania instancji obiektu IEnumerator, który obsługuje wszystkie podstawowe zestawy metod nawigacji.

IEnumerator to podstawowy interfejs dla enumeratorów, a użycie interfejsu IEnumerable wymaga, aby klasa musiała implementować IEnumerator. Oba interfejsy muszą zostać zaimplementowane, jeśli chcesz zapewnić obsługę foreach. Klasa abstrakcyjna „AbstractEnumerator” implementuje interfejs IEnumerator.

Funkcjonalność IEnumerable i IEnumerator

Interfejs IEnumerable wraz z obsługą interfejsu IEnumerator pozwala na iterację elementów w stosie za pomocą instrukcji „foreach”. Jest to podstawowy interfejs używany dla obiektów typu kolekcja. Iteracja rozpoczyna się od górnego elementu na stosie, a kończy na najstarszym elemencie na stosie. Mówiąc najprościej, reprezentuje obiekt, który można wyliczyć.

Wraz z interfejsem IEnumerator umożliwiają iterację elementów ArrayList w znormalizowany, sekwencyjny sposób, zaczynając od pierwszego elementu i kontynuując. Instrukcja foreach używa metod i właściwości interfejsu IEnumerator do iteracji wszystkich elementów w kolekcji.

IEnumerable vs. IEnumerator: Tabela porównawcza

Podsumowanie wersetów IEnumerable IEnumerator

Krótko mówiąc, zarówno IEnumerable, jak i IEnumerator to interfejsy używane do wyliczania lub iteracji klasy o charakterze kolekcji, co oznacza, że ​​ułatwiają iteracyjny dostęp do kolekcji niestandardowej. IEnumerable to ogólny interfejs dostępny dla obiektów typu kolekcji, a poprzez implementację interfejsu IEnumerable klasa ogólna zasadniczo umożliwia iterację poprzez interfejs IEnumerator. Używa tylko jednej metody GetEnumerator, która zwraca instancję klasy modułu wyliczającego, która implementuje interfejs IEnumerator. Interfejs IEnumerator ma być używany jako akcesorium i nie można go modyfikować podstawowej kolekcji. Udostępnia dwie abstrakcyjne metody Reset () i MoveNext () oraz właściwość Current do wywołania określonego elementu w kolekcji.