Прежде чем получить доступ к коллекции с помощью перечислителя, необходимо получить его. В каждом классе коллекции для этой цели предоставляется метод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() ;

}

}

Вот к какому результату приводит выполнение этой программы.

0123456789

0123456789

Вообще говоря, для циклического обращения к элементам коллекции циклforeachоказывается более удобным, чем перечислитель. Тем не менее перечислитель предоставляет больше возможностей для управления, поскольку его можно при желании всегда установить в исходное положение.

Применение перечислителя типа IDictionaryEnumerator

Если дляорганизации коллекции в виде словаря, например типаHashtable,реализуется необобщенный интерфейсIDictionary,то для циклического обращения к элементам такой коллекции следует использовать перечислитель типаIDictionaryEnumeratorвместо перечислителя типаIEnumerator.ИнтерфейсIDictionaryEnumeratorнаследует от интерфейсаIEnumeratorи имеет три дополнительных свойства. Первым из них является следующее свойство.

DictionaryEntry Entry { get; }

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

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