Страница 481 из 502
<b>object Key { get; }</b>
<b>object Value { get; }</b>
С помощью этих свойств осуществляется непосредственный доступ к ключу или значению.
Перечислитель типа IDictionaryEnumerator используется аналогично обычному перечислителю, за исключением того, что текущее значение в данном случае получается с помощью свойств Entry, Key или Value, а не свойства Current. Следовательно, приобретя перечислитель типа IDictionaryEnumerator, необходимо вызвать метод MoveNext(), чтобы получить первый элемент коллекции. А для получения остальных ее элементов следует продолжить вызовы метода MoveNext(). Этот метод возвращает логическое значение false, когда в коллекции больше нет ни одного элемента.
В приведенном ниже примере программы элементы коллекции типа Hashtable перечисляются с помощью перечислителя типа IDictionaryEnumerator.
<b>// Продемонстрировать применение перечислителя типа IDictionaryEnumerator.</b>
<b>using System;</b>
<b>using System.Collections;</b>
<b>class IDicEnumDemo {</b>
<b> static void Main() {</b>
<b> // Создать хеш-таблицу.</b>
<b> Hashtable ht = new Hashtable();</b>
<b> // Добавить элементы в таблицу,</b>
<b> ht.Add("Кен", "555-7756");</b>
<b> ht.Add("Мэри", "555-9876");</b>
<b> ht.Add("Том", "555-3456");</b>
<b> ht.Add("Тодд", "555-3452");</b>
<b> // Продемонстрировать применение перечислителя.</b>
<b> IDictionaryEnumerator etr = ht.GetEnumerator();</b>
<b> Console.WriteLine("Отобразить информацию с помощью свойства Entry.");</b>
<b> while (etr.MoveNext())</b>
<b> Console.WriteLine(etr.Entry.Key + ": " + etr.Entry.Value);</b>
<b> Console.WriteLine();</b>
<b> Console.WriteLine("Отобразить информацию " +</b>
<b> "с помощью свойств Key и Value.");</b>
<b> etr.Reset();</b>
<b> while (etr.MoveNext())</b>
<b> Console.WriteLine(etr.Key + ": " + etr.Value);</b>
<b> }</b>
<b>}</b>
Ниже приведен результат выполнения этой программы.
<b>Отобразить информацию с помощью свойства Entry.</b>
<b>Тодд: 555-3452</b>
<b>Том: 555-3456</b>
<b>Мэри: 555-9876</b>
<b>Кен: 555-7756</b>
<b>Отобразить информацию с помощью свойств Key и Value.</b>
<b>Тодд: 555-3452</b>
<b>Том: 555-3456</b>
<b>Мэри: 555-9876</b>
<b>Кен: 555-7756</b>
Реализация интерфейсов IEnumerable и IEnumerator
Как упоминалось выше, для циклического обращения к элементам коллекции зачастую проще (да и лучше) организовать цикл foreach, чем пользоваться непосредственно методами интерфейса IEnumerator. Тем не менее ясное представление о принципе действия подобных интерфейсов важно иметь по еще одной причине: если требуется создать класс, содержащий объекты, перечисляемые в цикле foreach, то в этом классе следует реализовать интерфейсы IEnumerator и IEnumerable. Иными словами, для того чтобы обратиться к объекту определяемого пользователем класса в цикле foreach, необходимо реализовать интерфейсы IEnumerator и IEnumerable в их обобщенной или необобщенной форме. Правда, сделать это будет нетрудно, поскольку оба интерфейса не очень велики.
В приведенном ниже примере программы интерфейсы IEnumerator и IEnumerable реализуются в необобщенной форме, с тем чтобы перечислить содержимое массива, инкапсулированного в классе MyClass.
<b>// Реализовать интерфейссы IEnumerable и IEnumerator</b>
<b>using System;</b>
<b>using System.Collections;</b>
<b>class MyClass : IEnumerator, IEnumerable {</b>
<b> char[] chrs = { 'А', 'В', 'C', 'D' };</b>
<b> int idx = -1;</b>
<b> // Реализовать интерфейс IEnumerable.</b>
<b> public IEnumerator GetEnumerator() {</b>
<b> return this;</b>
<b> }</b>