К элементам коллекции нередко приходится обращаться циклически, например, для отображения каждого элемента коллекции. С этой целью можно, с одной стороны, организовать цикл
foreach,как было показано в приведенных выше примерах, а с другой — воспользоваться перечислителем.В интерфейсе
IEnumeratorопределяется одно свойство,Current,необобщенная форма которого приведена ниже.object Current { get; }
А в интерфейсе
IEnumeratorТ Current { get; }
В обеих формах свойства
Currentполучается текущий перечисляемый элемент коллекции. Но поскольку свойствоCurrentдоступно только для чтения, то перечислитель может служить только для извлечения, но не видоизменения объектов в коллекции.В интерфейсе
IEnumeratorопределяются два метода. Первым из них является методMoveNext (), объявляемый следующим образом.bool MoveNext()
При каждом вызове метода
MoveNext() текущее положение перечислителя смещается к следующему элементу коллекции. Этот метод возвращает логическое значениеtrue,если следующий элемент коллекции доступен, и логическое значениеfalse,если достигнут конец коллекции. Перед первым вызовом методаMoveNext() значение свойстваCurrentоказывается неопределенным. (В принципе до первого вызова методаMoveNext() перечислитель обращается к несуществующему элементу, который должен находиться перед первым элементом коллекции. Именно поэтому приходится вызывать методMoveNext (), чтобы перейти к первому элементу коллекции.)Для установки перечислителя в исходное положение, соответствующее началу коллекции, вызывается приведенный ниже метод
Reset ().void Reset()
После вызова метода
Reset() перечисление вновь начинается с самого начала коллекции. Поэтому, прежде чем получить первый элемент коллекции, следует вызвать методMoveNext().В интерфейсе
IEnumeratorНеобходимо также обратить внимание на два следующих момента. Во-первых, перечислитель нельзя использовать для изменения содержимого перечисляемой с его помощью коллекции. Следовательно, перечислители действуют по отношению к коллекции как к доступной только для чтения. И во-вторых, любое изменение в перечисляемой коллекции делает перечислитель недействительным.
Применение обычного перечислителя