В обеих формах свойства Current
Current
доступно только для чтения, то перечислитель может служить только для извлечения, но не видоизменения объектов в коллекции.В интерфейсе IEnumerator
MoveNext()
, объявляемый следующим образом.bool MoveNext()
При каждом вызове метода MoveNext()
true
, если следующий элемент коллекции доступен, и логическое значение false
, если достигнут конец коллекции. Перед первым вызовом метода MoveNext()
значение свойства Current
оказывается неопределенным. (В принципе до первого вызова метода MoveNext()
перечислитель обращается к несуществующему элементу, который должен находиться перед первым элементом коллекции. Именно поэтому приходится вызывать метод MoveNext()
, чтобы перейти к первому элементу коллекции.)Для установки перечислителя в исходное положение, соответствующее началу коллекции, вызывается приведенный ниже метод Reset()
void Reset()
После вызова метода Reset()
MoveNext()
.В интерфейсе IEnumerator
MoveNext()
и Reset()
действуют по тому же самому принципу.Необходимо также обратить внимание на два следующих момента. Во-первых, перечислитель нельзя использовать для изменения содержимого перечисляемой с его помощью коллекции. Следовательно, перечислители действуют по отношению к коллекции как к доступной только для чтения. И во-вторых, любое изменение в перечисляемой коллекции делает перечислитель недействительным.
Прежде чем получить доступ к коллекции с помощью перечислителя, необходимо получить его. В каждом классе коллекции для этой цели предоставляется метод GetEnumerator()
1. Получить перечислитель, устанавливаемый в начало коллекции, вызвав для этой коллекции метод GetEnumerator()
2. Организовать цикл, в котором вызывается метод MoveNext()
MoveNext()
возвращает логическое значение true
.3. Получить в цикле каждый элемент коллекции с помощью свойства Current
Ниже приведен пример программы, в которой реализуется данная процедура. В этой программе используется класс ArrayList
// Продемонстрировать применение перечислителя.
using System;
using System.Collections;
class EnumeratorDemo {
static void Main() {
ArrayList list = new ArrayList(1);
for (int i = 0; i < 10; i++) list.Add(i);
// Использовать перечислитель для доступа к списку.
IEnumerator etr = list.GetEnumerator();
while (etr.MoveNext())
Console.Write(etr.Current + " ");
Console.WriteLine();
// Повторить перечисление списка.
etr.Reset();
while (etr.MoveNext())
Console.Write(etr.Current + " ");
Console.WriteLine();
}
}
Вот к какому результату приводит выполнение этой программы.
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
Вообще говоря, для циклического обращения к элементам коллекции цикл foreach
Если для организации коллекции в виде словаря, например типа Hashtable
IDictionary
, то для циклического обращения к элементам такой коллекции следует использовать перечислитель типа IDictionaryEnumerator
вместо перечислителя типа IEnumerator
. Интерфейс IDictionaryEnumerator
наследует от интерфейса IEnumerator
и имеет три дополнительных свойства. Первым из них является следующее свойство.