Преди да скочим в разликата между IEnumerable и IEnumerator, нека първо разберем термините Enumerator и 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 да извиква определен елемент от колекция.