Как следует из предыдущих примеров, реализовать интерфейсы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 .
Обозначениеyieldслужит в языке C# в качестве