Прежде чем мы перейдем к разнице между IEnumerable и IEnumerator, давайте сначала разберемся с терминами Enumerator и Enumerable, а также когда и зачем их использовать..
Enumerable - это модуль, используемый в классе Array, который предоставляет вам Enumerator. Сам класс не каждый метод. Фактически, он использует метод GetEnumerator, который дает вам Enumerator для извлечения его элемента..
Перечислитель - это объект, который возвращает каждый элемент в коллекции в определенном порядке, именно так, как они запрашиваются. Компилятор генерирует код, который использует Enumerator, когда вы пишете цикл foreach в C #.
IEnumerator - это интерфейс, реализованный перечислителем, а перечисляемый класс реализует интерфейс IEnumerable..
IEnumerable - это базовый интерфейс, используемый для получения объекта, который знает, как перечислять (или перебирать) элементы коллекции.
Это реализация шаблона итератора, который предоставляет механизм для обхода объекта в коллекции независимо от его внутренней структуры. Интерфейс IEnumerable представляет объект, который можно перебирать в коллекции..
Он использует только один метод «GetEnumerator», который возвращает экземпляр класса перечислителя, который реализует интерфейс IEnumerator..
Интерфейс IEnumerator, с другой стороны, объявляет два метода - Reset () и MoveNext () - и одно свойство, Current. MoveNext () возвращает логическое значение, которое указывает конец списка и помогает расположить первый элемент в списке после вызова метода Reset () - он устанавливает перечислитель в положение по умолчанию, чтобы повторять список из начало.
Свойство Current может быть вызвано только через экземпляр интерфейса 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, позволяет перебирать элементы в стеке с помощью оператора 'foreach'. Это базовый интерфейс, используемый для объектов типа коллекции. Итерация начинается с верхнего элемента в стеке и заканчивается самым старым элементом в стеке. Проще говоря, он представляет объект, который может быть перечислен.
Вместе с интерфейсом IEnumerator они позволяют элементам ArrayList повторяться стандартизированным, последовательным образом, начиная с первого элемента и далее. Оператор foreach использует методы и свойства интерфейса IEnumerator для итерации всех элементов в коллекции.
В двух словах, IEnumerable и IEnumerator являются интерфейсами, используемыми для перечисления или итерации класса, имеющего коллекционную природу, что означает, что они облегчают итеративный доступ в пользовательской коллекции. IEnumerable является универсальным интерфейсом, доступным для объектов типа коллекции, и, реализуя интерфейс IEnumerable, универсальный класс, по существу, позволяет выполнять итерации через интерфейс IEnumerator. Он использует только один метод GetEnumerator, который возвращает экземпляр класса перечислителя, который реализует интерфейс IEnumerator. Интерфейс IEnumerator предназначен для использования в качестве методов доступа, и его нельзя использовать для изменения базовой коллекции. Он предоставляет два абстрактных метода Reset () и MoveNext () и свойство Current для вызова определенного элемента в коллекции..