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



 

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

 

 

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

 

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

 

DictionaryEntry Entry { get; }

 

Свойство Entry позволяет получить пару "ключ-значение" из перечислителя в форме структуры 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");

 


Дата добавления: 2019-02-12; просмотров: 254; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!