Читаем C# 4.0: полное руководство полностью

    MyClass mc = new MyClass();

    foreach (char ch in mc)

      Console.Write(ch + " ");

    Console.WriteLine();

  }

}


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


А В С D Е


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


Создание именованного итератора

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

объект типа IEnumerable. Именно этот объект используется в коде для предоставления итератора. Именованный итератор представляет собой метод, общая форма которого приведена ниже:


public IEnumerable имя_итератора (список_параметров) {

  // ...

  yield return obj;

}


где имя_итератора обозначает конкретное имя метода; список_параметров — от нуля до нескольких параметров, передаваемых методу итератора; obj — следующий объект, возвращаемый итератором. Как только именованный итератор будет создан, его можно использовать везде, где он требуется, например для управления циклом foreach.

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


// Использовать именованные итераторы.

using System;

using System.Collections;

class MyClass {

  char ch = 'A';

  // Этот итератор возвращает буквы английского алфавита,

  // начиная с буквы А и кончая указанным конечным пределом

  public IEnumerable MyItr(int end) {

    for (int i = 0; i < end; i++)

      yield return (char)(ch + i);

  }

  // Этот итератор возвращает буквы в заданных пределах

  public IEnumerable MyItr(int begin, int end) {

    for (int i = begin; i < end; i++)

      yield return (char)(ch + i);

  }

}


class ItrDemo4 {

  static void Main() {

    MyClass mc = new MyClass();

    Console.WriteLine("Возвратить по очереди первые 7 букв:");

    foreach (char ch in mc.MyItr(7))

      Console.Write(ch + " ");


    Console.WriteLine("\n");


    Console.WriteLine("Возвратить по очереди буквы от F до L:");

    foreach (char ch in mc.MyItr(5, 12))

      Console.Write(ch + " ");


    Console.WriteLine();

  }

}


Эта программа дает следующий результат.


Возвратить по очереди первые 7 букв:

А В С D Е F G


Возвратить по очереди буквы от F до L:

F G Н I J К L


Создание обобщенного итератора

В приведенных выше примерах применялись необобщенные итераторы, но, конечно, ничто не мешает создать обобщенные итераторы. Для этого достаточно возвратить объект обобщенного типа IEnumerator или IEnumerable. Ниже приведен пример создания обобщенного итератора.


// Простой пример обобщенного итератора,

using System;

using System.Collections.Generic;

class MyClass {

  T[] array;


  public MyClass(T[] a) {

    array = a;

  }


  // Этот итератор возвращает символы из массива chrs.

  public IEnumerator GetEnumerator() {

    foreach (T obj in array)

      yield return obj;

  }

}


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

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

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Разработка приложений в среде Linux. Второе издание
Разработка приложений в среде Linux. Второе издание

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет СЃРѕР±РѕР№ отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из РґСЂСѓРіРёС… операционных систем. РџРѕРґСЂРѕР±но рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование СЃРІРѕР±одно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Р

Майкл К. Джонсон , Эрик В. Троан

Программирование, программы, базы данных