В данной программе сначала создается класс
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 = { 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перечислено.