Как следует из предыдущих примеров, реализовать интерфейсы
IEnumeratorиIEnumerableнетрудно. Но еще проще воспользоватьсяОбратимся сначала к простому примеру итератора. Приведенная ниже программа является измененной версией предыдущей программы, в которой вместо явной реализации интерфейсов
IEnumeratorиIEnumerableприменяется итератор.// Простой пример применения итератора.
using System;
using System.Collections;
class MyClass {
char[] chrs = { f
Af, 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# в качестве