К элементам коллекции нередко приходится обращаться циклически, например, для отображения каждого элемента коллекции. С этой целью можно, с одной стороны, организовать циклforeach,как было показано в приведенных выше примерах, а с другой — воспользоваться перечислителем.Перечислитель —это объект, который реализует необобщенный интерфейсIEnumeratorили обобщенный интерфейсIEnumerator.

В интерфейсеIEnumeratorопределяется одно свойство,Current,необобщенная форма которого приведена ниже.

object Current { get; }

А в интерфейсеIEnumeratorобъявляется следующая обобщенная форма свойстваCurrent.

Т Current { get; }

В обеих формах свойстваCurrentполучается текущий перечисляемый элемент коллекции. Но поскольку свойствоCurrentдоступно только для чтения, то перечислитель может служить только для извлечения, но не видоизменения объектов в коллекции.

В интерфейсеIEnumeratorопределяются два метода. Первым из них является методMoveNext (), объявляемый следующим образом.

bool MoveNext()

При каждом вызове методаMoveNext() текущее положение перечислителя смещается к следующему элементу коллекции. Этот метод возвращает логическое значениеtrue,если следующий элемент коллекции доступен, и логическое значениеfalse,если достигнут конец коллекции. Перед первым вызовом методаMoveNext() значение свойстваCurrentоказывается неопределенным. (В принципе до первого вызова методаMoveNext() перечислитель обращается к несуществующему элементу, который должен находиться перед первым элементом коллекции. Именно поэтому приходится вызывать методMoveNext (), чтобы перейти к первому элементу коллекции.)

Для установки перечислителя в исходное положение, соответствующее началу коллекции, вызывается приведенный ниже методReset ().

void Reset()

После вызова методаReset() перечисление вновь начинается с самого начала коллекции. Поэтому, прежде чем получить первый элемент коллекции, следует вызвать методMoveNext().

В интерфейсеIEnumeratorметодыMoveNext() иReset() действуют по тому же самому принципу.

Необходимо также обратить внимание на два следующих момента. Во-первых, перечислитель нельзя использовать для изменения содержимого перечисляемой с его помощью коллекции. Следовательно, перечислители действуют по отношению к коллекции как к доступной только для чтения. И во-вторых, любое изменение в перечисляемой коллекции делает перечислитель недействительным.

Применение обычного перечислителя

Перейти на страницу:

Похожие книги