Читать «C# 4.0 полное руководство - 2011» онлайн - страница 622
Герберт Шилдт
Далее в методе Main () создается объект тс типа MyClass, и содержимое этого объекта дважды отображается в цикле foreach.
Применение итераторов
Как следует из предыдущих примеров, реализовать интерфейсы IEnumerator и IEnumerable нетрудно. Но еще проще воспользоваться
Обратимся сначала к простому примеру итератора. Приведенная ниже программа является измененной версией предыдущей программы, в которой вместо явной реализации интерфейсов IEnumerator и IEnumerable применяется итератор.
// Простой пример применения итератора.
using System;
using System.Collections;
class MyClass {
char[] chrs = { fAf, fBf, 'C1, 'D' };
// Этот итератор возвращает символы из массива chrs. public IEnumerator GetEnumerator() {
foreach(char ch in chrs) yield return ch;
}
}
class ItrDemo {
static void Main() {
MyClass me = new MyClassO;
foreach(char ch in me)
Console .Write (ch + 11 ");
Console.WriteLine();
}
}
При выполнении этой программы получается следующий результат.
А В С D
Как видите, содержимое массива me. chrs перечислено.
Рассмотрим эту программу более подробно. Во-первых, обратите внимание на то, что в классе MyClass не указывается IEnumerator в качестве реализуемого интерфейса. При создании итератора компилятор реализует этот интерфейс автоматически. И во-вторых, обратите особое внимание на метод GetEnumerator (), который ради удобства приводится ниже еще раз.
// Этот итератор возвращает символы из массива chrs. public IEnumerator GetEnumerator() {
foreach(char ch in chrs) yield return ch;
}
Это и есть итератор для объектов класса MyClass. Как видите, в нем явно реализуется метод GetEnumerator (), определенный в интерфейсе IEnumerable. А теперь перейдем непосредственно к телу данного метода. Оно состоит из цикла foreach, в котором возвращаются элементы из массива chrs. И делается это с помощью оператора yield return. Этот оператор возвращает следующий объект в коллекции, которым в данном случае оказывается очередной символ в массиве chrs. Благодаря этому средству обращение к объекту тс типа MyClass организуется в цикле foreach внутри метода Main ().