Перш ніж ми перейдемо до різниці між IEnumerable та IEnumerator, давайте спочатку розберемося з термінами Enumerator та Enumerable та коли і навіщо їх використовувати.
Enumerable - це модуль, який використовується в класі Array, який дає вам Enumerator. Сам клас не кожен метод. Насправді він використовує метод під назвою "GetEnumerator", який дає вам Перелік для отримання його елемента.
Перелік - це об'єкт, який повертає кожен елемент у колекції у певному порядку, точно так, як вони запитуються. Компілятор генерує код, який використовує Enumerator, коли ви пишете цикл foreach у C #.
IEnumerator - це інтерфейс, реалізований перелічувачем, і перелічуваний клас реалізує інтерфейс IEnumerable.
IEnumerable - це базовий інтерфейс, який використовується для отримання об'єкта, який вміє перераховувати (або повторювати) над елементами колекції.
Це реалізація схеми ітератора, яка забезпечує механізм переміщення об'єкта в колекції незалежно від його внутрішньої структури. Інтерфейс IEnumerable являє собою об'єкт, який можна повторити в колекції.
Він використовує лише один метод “GetEnumerator”, який повертає екземпляр класу перелічувача, що реалізує інтерфейс IEnumerator.
Інтерфейс IEnumerator, з іншого боку, оголошує два способи - Reset () і MoveNext () - і одне властивість, Current. MoveNext () повертає булеву долю, яка вказує кінець списку і допомагає розташувати перший елемент у списку після виклику методу Reset () - він встановлює перечислювач у його положення за замовчуванням, щоб повторно ітератувати список із початок.
Поточне властивість можна викликати лише через екземпляр інтерфейсу 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 для виклику певного елемента в колекції.