Когда этот оператор выполняется, итератор уведомляет о том, что достигнут конец коллекции. А это, по существу, останавливает сам итератор.
Приведенная ниже программа является версией предыдущей программы, измененной с целью отобразить только первые десять букв английского алфавита.
// Пример прерывания итератора.
Using System;
Using System.Collections;
class MyClass { char ch = 'A';
// Этот итератор возвращает первые 10 букв английского алфавита, public IEnumerator GetEnumerator() {
for(int i=0; i < 26; i++) {
if(i == 10) yield break; // прервать итератор преждевременно yield return (char) (ch + i);
}
}
}
class ItrDemo3 {
static void Main() {
MyClass me = new MyClass();
Foreach(char ch in me)
Console.Write(ch + " ");
Console.WriteLine();
}
}
Эта программа дает следующий результат.
ABCDEFGHIJ
Применение нескольких операторов yield
В итераторе допускается применение нескольких операторов yield. Но каждый такой оператор должен возвращать следующий элемент в коллекции. В качестве примера рассмотрим следующую программу.
// Пример применения нескольких операторов yield.
Using System;
Using System.Collections;
class MyClass {
// Этот итератор возвращает буквы А, В, С, D и Е. public IEnumerator GetEnumerator() {
yield return 'A'; yield return 'B'; yield return 'C'; yield return 'D'; yield return 'E';
}
}
class ItrDemo5 {
static void Main() {
MyClass me = new MyClass();
Foreach(char ch in me)
Console.Write(ch + " ");
Console.WriteLine();
}
}
Ниже приведен результата выполнения этой программы.
А В С D Е
В данной программе внутри метода GetEnumerator () выполняются пять операторов yield. Следует особо подчеркнуть, что они выполняются по очереди и каждый раз, когда из коллекции получается очередной элемент. Таким образом, на каждом шаге цикла foreach в методе Main () возвращается только один символ.
Создание именованного итератора
В приведенных выше примерах был продемонстрирован простейший способ реализации итератора. Но ему имеется альтернатива в виде именованного итератора. В данном случае создается метод, оператор или аксессор, возвращающий ссылку на
объект типа I Enumerable. Именно этот объект используется в коде для предоставления итератора. Именованный итератор представляет собой метод, общая форма которого приведена ниже:
public IEnumerable имя_итератора (список_параметров) {
// ...
yield return obj;
}
где имя_итератора обозначает конкретное имя метода; список_параметров — от нуля до нескольких параметров, передаваемых методу итератора; obj — следующий объект, возвращаемый итератором. Как только именованный итератор будет создан, его можно использовать везде, где он требуется, например для управления циклом
Foreach.
Именованные итераторы оказываются весьма полезными в некоторых ситуациях, поскольку они позволяют передавать аргументы итератору, управляющему процессом получения конкретных элементов из коллекции. Например, итератору можно передать начальный и конечный пределы совокупности элементов, возвращаемых из коллекции итератором. Эту форму итератора можно перегрузить, расширив ее функциональные возможности. В приведенном ниже примере программы демонстрируются два способа применения именованного итератора для получения элементов коллекции. В одном случае элементы перечисляются в заданных начальном и конечном пределах, а в другом — элементы перечисляются с начала последовательности и до указанного конечного предела.
// Использовать именованные итераторы.
Using System;
Using System.Collections;
class MyClass { char ch = 'A';
// Этот итератор возвращает буквы английского алфавита,
}
}
class ItrDemo4 {
static void Main() {
MyClass me = new MyClass ();
Console.WriteLine("Возвратить по очереди первые 7 букв:"); foreach(char ch in mc.MyItr(7))
Console.Write(ch + " ");
Console .WriteLine (lf\nlf) ;
Console.WriteLine("Возвратить по очереди буквы от F до L:"); foreach(char ch in mc.Myltr(5, 12))
Console.Write(ch + " ");
Console.WriteLine();
}
}