В данной программе сначала создается классMyClass,в котором инкапсулируется небольшой массив типаchar,состоящий из символовА-D.Индекс этого массива хранится в переменнойidx,инициализируемой значением -1. Затем в классеMyClassреализуются оба интерфейса,IEnumeratorиIEnumerable.МетодGetEnumerator() возвращает ссылку на перечислитель, которым в данном случае оказывается текущий объект. СвойствоCurrentвозвращает следующий символ в массиве, т.е. объект, указываемый по индексуidx.МетодMoveNext() перемещает индексidxв следующее положение. Этот метод возвращает логическое значениеfalse,если достигнут конец коллекции, в противном случае — логическое значениеtrue.Напомним, что перечислитель оказывается неопределенным вплоть до первого вызова методаMoveNext ().Следовательно, методMoveNext() автоматически вызывается в циклеforeachперед обращением к свойствуCurrent.Именно поэтому первоначальное значение переменнойidxустанавливается равным -1. Оно становится равным нулю на первом шаге циклаforeach.Обобщенная реализация рассматриваемых здесь интерфейсов будет действовать по тому же самому принципу.
Далее в методе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перечислено.