Добавить в цитаты Настройки чтения

Страница 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(&quot;Кен&quot;, &quot;555-7756&quot;);</b>

<b>    ht.Add(&quot;Мэри&quot;, &quot;555-9876&quot;);</b>

<b>    ht.Add(&quot;Том&quot;, &quot;555-3456&quot;);</b>

<b>    ht.Add(&quot;Тодд&quot;, &quot;555-3452&quot;);</b>

<b>    // Продемонстрировать применение перечислителя.</b>

<b>    IDictionaryEnumerator etr = ht.GetEnumerator();</b>

<b>    Console.WriteLine(&quot;Отобразить информацию с помощью свойства Entry.&quot;);</b>

<b>    while (etr.MoveNext())</b>

<b>      Console.WriteLine(etr.Entry.Key + &quot;: &quot; + etr.Entry.Value);</b>

<b>    Console.WriteLine();</b>

<b>    Console.WriteLine(&quot;Отобразить информацию &quot; +</b>

<b>                 &quot;с помощью свойств Key и Value.&quot;);</b>

<b>    etr.Reset();</b>

<b>    while (etr.MoveNext())</b>

<b>      Console.WriteLine(etr.Key + &quot;: &quot; + 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>