Разница между IEnumerable и IEnumerator
Прежде чем перейти к рассмотрению разницы между IEnumerable и IEnumerator, давайте сначала разберемся в терминах Enumerator и Enumerable, а также в том, когда и зачем их использовать.
Enumerable — это модуль, используемый в классе Array, который дает вам Enumerator. Сам класс не имеет ни одного метода. Фактически, он использует метод под названием ‘GetEnumerator’, который предоставляет вам перечислитель для повторного получения его элемента.
Enumerator — это объект, который возвращает каждый элемент коллекции в определенном порядке, точно в соответствии с запросом. Компилятор генерирует код, использующий перечислитель, когда вы пишете цикл foreach в C#.
IEnumerator — это интерфейс, реализуемый перечислителем, а класс enumerable реализует интерфейс IEnumerable.
Что такое IEnumerable?
IEnumerable — это базовый интерфейс, используемый для получения объекта, который умеет перечислять (или итерировать) элементы в коллекции.
Это реализация паттерна итератора, который обеспечивает механизм обхода объекта в коллекции независимо от его внутренней структуры. Интерфейс IEnumerable представляет объект, по которому можно выполнять итерации в коллекции.
Он использует только один метод ‘GetEnumerator’, который возвращает экземпляр класса перечислителя, реализующего интерфейс IEnumerator.
Что такое IEnumerator?
Интерфейс IEnumerator, с другой стороны, объявляет два метода — Reset и MoveNext — и одно свойство, Current. Метод MoveNext возвращает булево значение, указывающее на конец списка, и помогает позиционировать первый элемент в списке после вызова метода Reset — он устанавливает перечислитель в позицию по умолчанию, чтобы повторно просмотреть список с самого начала.
Свойство Current может быть вызвано только через экземпляр интерфейса IEnumerator и возвращает текущий элемент в списке.
Разница между IEnumerable и IEnumerator
Основы IEnumerable и Ienumerator
IEnumerable и IEnumerator являются интерфейсами, реализующими шаблон проектирования итератора в Net Framework. В Net Framework доступ к отдельным элементам в пользовательской коллекции осуществляется при реализации интерфейсов IEnumerable и IEnumerator. Интерфейс IEnumerable декларирует только один метод под названием GetEnumerator, который возвращает другой тип интерфейса под названием IEnumerator для данной коллекции.IEnumerator, с другой стороны, является базовым интерфейсом для всех негенеративных перечислителей, которые используются для чтения данных в коллекции. Однако перечислители не могут быть использованы для изменения базовой коллекции.
Методы
Интерфейс IEnumerable определяет только один метод GetEnumerator, который является методом экземпляра, используемым для нескольких различных типов коллекций. Он получает итератор IEnumerator, который можно использовать для перебора всех значений из коллекции. Когда вы пишете цикл foreach в C#, генерируемый им код вызывает метод GetEnumerator для создания итератора Enumerator, используемого циклом.
IEnumerator, с другой стороны, использует два метода MoveNext и Reset и свойство Current. Метод MoveNext переводит перечислитель на следующий элемент коллекции, а метод Reset устанавливает перечислитель в позицию по умолчанию, которая находится перед первым элементом коллекции.
Выполнение
IEnumerable — это общий интерфейс, который предоставляет абстракцию для перебора элементов, и, реализуя интерфейс IEnumerable, общий класс, по сути, обеспечивает итерацию через интерфейс IEnumerator. При этом эти классы в конечном итоге предоставляют общий интерфейс для получения экземпляра объекта IEnumerator, который поддерживает весь базовый набор методов навигации.
IEnumerator является базовым интерфейсом для перечислителей, а использование интерфейса IEnumerable требует, чтобы класс реализовал IEnumerator. Оба интерфейса должны быть реализованы, если вы хотите обеспечить поддержку foreach. Абстрактный класс ‘AbstractEnumerator’ реализует интерфейс IEnumerator.
Функциональность IEnumerable и IEnumerator
Интерфейс IEnumerable, наряду с поддерживающим его интерфейсом IEnumerator, позволяет выполнять итерации по элементам в стеке с помощью оператора ‘foreach’. Это основной интерфейс, используемый для объектов типа коллекции. Итерация начинается с верхнего элемента в стеке и заканчивается самым старым элементом в стеке. Проще говоря, он представляет собой объект, который можно перечислить.
Вместе с интерфейсом IEnumerator они позволяют выполнять итерацию элементов ArrayList стандартным последовательным способом, начиная с первого элемента и далее. Оператор foreach использует методы и свойства интерфейса IEnumerator для перебора всех элементов коллекции.
Обзор IEnumerable в сравнении с IEnumerator
В двух словах, IEnumerable и IEnumerator — это интерфейсы, используемые для перечисления или итерации класса, имеющего характер коллекции, что означает, что они облегчают итерационный доступ в пользовательской коллекции. IEnumerable — это общий интерфейс, доступный для объектов типа коллекции, и, реализуя интерфейс IEnumerable, общий класс, по сути, обеспечивает итерацию через интерфейс IEnumerator. Он использует только один метод GetEnumerator, который возвращает экземпляр класса перечислителя, реализующего интерфейс IEnumerator. Интерфейс IEnumerator предназначен для использования в качестве аксессоров и не может быть использован для модификации основной коллекции. Он предоставляет два абстрактных метода Reset и MoveNext, а также свойство Current для вызова определенного элемента в коллекции.