C# 4.0 полное руководство - 2011
Шрифт:
Для установки перечислителя в исходное положение, соответствующее началу коллекции, вызывается приведенный ниже метод Reset .
void Reset
После вызова метода Reset перечисление вновь начинается с самого начала коллекции. Поэтому, прежде чем получить первый элемент коллекции, следует вызвать метод MoveNext.
В интерфейсе IEnumerator<T> методы 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 ;
}
}
Вот к какому результату приводит выполнение этой программы.
0123456789
0123456789
Вообще говоря, для циклического обращения к элементам коллекции цикл foreach оказывается более удобным, чем перечислитель. Тем не менее перечислитель предоставляет больше возможностей для управления, поскольку его можно при желании всегда установить в исходное положение.
Применение
перечислителя типа IDictionaryEnumeratorЕсли для организации коллекции в виде словаря, например типа Hashtable, реализуется необобщенный интерфейс IDictionary, то для циклического обращения к элементам такой коллекции следует использовать перечислитель типа IDictionaryEnumerator вместо перечислителя типа IEnumerator. Интерфейс IDictionaryEnumerator наследует от интерфейса IEnumerator и имеет три дополнительных свойства. Первым из них является следующее свойство.
DictionaryEntry Entry { get; }
Свойство Entry позволяет получить пару "ключ-значение7' из перечислителя в форме структуры DictionaryEntry. Напомним, что в структуре DictionaryEntry определяются два свойства, Key и Value, с помощью которых можно получать доступ к ключу или значению, связанному с элементом коллекции. Ниже приведены два других свойства, определяемых в интерфейсе IDictionaryEnumerator.
object Key { get; } object Value { get; }
С помощью этих свойств осуществляется непосредственный доступ к ключу или значению.
Перечислитель типа IDictionaryEnumerator используется аналогично обычному перечислителю, за исключением того, что текущее значение в данном случае получается с помощью свойств Entry, Key или Value, а не свойства Current. Следовательно, приобретя перечислитель типа IDictionaryEnumerator, необходимо вызвать метод MoveNext , чтобы получить первый элемент коллекции. А для получения остальных ее элементов следует продолжить вызовы метода MoveNext . Этот метод возвращает логическое значение false, когда в коллекции больше нет ни одного элемента.
В приведенном ниже примере программы элементы коллекции типа Hashtable перечисляются с помощью перечислителя типа IDictionaryEnumerator.
// Продемонстрировать применение перечислителя типа IDictionaryEnumerator.
using System;
using System.Collections;
class IDicEnumDemo { static void Main {
// Создать хеш-таблицу.
Hashtable ht = new Hashtable;
// Добавить элементы в таблицу, ht.Add("Кен", "555-7756"); ht.Add("Мэри", "555-9876"); ht.Add("Том", "555-3456"); ht.Add("Тодд", "555-3452");
// Продемонстрировать применение перечислителя.
IDictionaryEnumerator etr = ht.GetEnumerator;
Console.WriteLine("Отобразить информацию с помощью свойства Entry."); while(etF.MoveNext)
Console.WriteLine(etr.Entry.Key + ": " + etr.Entry.Value);