| 
 | |||||||
| Интерфейсы IEnumerable и IEnumerator 
		  Время создания: 04.09.2019 18:55		  
		  Автор: https://metanit.com		  
		  Текстовые метки: IEnumerable, IEnumerator, c#, коллекции, перечисления		  
		    Раздел: Компьютер - C#		   
		  Запись: Kozlov-AE/Tetra/master/base/15640785133fjhsln722/text.html на raw.githubusercontent.com		  
 | |||||||
|  | |||||||
| Как мы увидели, основной для большинства коллекций является реализация интерфейсов IEnumerable и IEnumerator. Благодаря такой реализации мы можем перебирать объекты в цикле foreach: 
 Перебираемая коллекция должна реализовать интерфейс IEnumerable. Интерфейс IEnumerable имеет метод, возвращающий ссылку на другой интерфейс - перечислитель: 
 А интерфейс IEnumerator определяет функционал для перебора внутренних объектов в контейнере: Метод MoveNext() перемещает указатель на текущий элемент на следующую позицию в последовательности. Если последовательность еще не закончилась, то возвращает true. Если же последовательность закончилась, то возвращается false. Свойство Current возвращает объект в последовательности, на который указывает указатель. Метод Reset() сбрасывает указатель позиции в начальное положение. Каким именно образом будет осуществляться перемещение указателя и получение элементов зависит от реализации интерфейса. В различным реализациях логика может быть построена различным образом. Например, без использования цикла foreach перебирем коллекцию с помощью интерфейса IEnumerator: Реализация IEnumerable и IEnumerator Рассмотрим простешую реализацию IEnumerable на примере: В данном случае класс Week, который представляет неделю и хранит все дни недели, реализует интерфейс IEnumerable. Однако в данном случае мы поступили очень просто - вместо реализации IEnumerator мы просто возвращаем в методе GetEnumerator объект IEnumerator для массива. 
 Благодаря этому мы можем перебрать все дни недели в цикле foreach. В то же время стоит отметить, что для перебора коллекции через foreach в принципе необязательно реализовать интерфейс IEnumerable. Достаточно в классе определить публичный метод GetEnumerator, который бы возвращал объект IEnumerator. Например: Однако это было довольно просто - мы просто используем уже готовый перчислитель массива. Однако, возможно, потребуется задать свою собственную логику перебора объектов. Для этого реализуем интерфейс IEnumerator: Здесь теперь класс Week использует не встроенный перечислитель, а WeekEnumerator, который реализует IEnumerator. Ключевой момент при реализации перечислителя - перемещения указателя на элемент. В классе WeekEnumerator для хранения текущей позиции определена переменная position. Следует учитывать, что в самом начале (в исходном состоянии) указатель должен указывать на позицию условно перед первым элементом. Когда будет производиться цикл foreach, то данный цикл вначале вызывает метод MoveNext и фактически перемещает указатель на одну позицию в перед и только затем обращается к свойству Current для получения элемента в текущей позиции. В примерах выше использовались необобщенные версии интерфейсов, однако мы также можем использовать их обобщенные двойники: | |||||||
| 
 Так же в этом разделе:
  
 | |||||||
|   | |||||||
| 
 | |||||||
| 
 |