Реализация интерфейсов IEnumerable и IEnumerator
Для циклического обращения к элементам коллекции зачастую проще (да и лучше) организовать цикл foreach, чем пользоваться непосредственно методами интерфейса IEnumerator. Тем не менее ясное представление о принципе действия подобных интерфейсов важно иметь по еще одной причине: если требуется создать класс, содержащий объекты, перечисляемые в цикле foreach, то в этом классе следует реализовать интерфейсы IEnumerator и IEnumerable. Иными словами, для того чтобы обратиться к объекту определяемого пользователем класса в цикле foreach, необходимо реализовать интерфейсы IEnumerator и IEnumerable в их обобщенной или необобщенной форме. Правда, сделать это будет нетрудно, поскольку оба интерфейса не очень велики.
Ниже приведен пример, в котором класс MyInt реализует данные интерфейсы:
using System; using System.Collections; namespace ConsoleApplication1 { class MyInt : IEnumerable, IEnumerator { int[] ints = { 12, 13, 1, 4 }; int index = -1; // Реализуем интерейс IEnumerable public IEnumerator GetEnumerator() { return this; } // Реализуем интерфейс IEnumerator public bool MoveNext() { if (index == ints.Length - 1) { Reset(); return false; } index++; return true; } public void Reset() { index = -1; } public object Current { get { return ints[index]; } } } class Program { static void Main() { MyInt mi = new MyInt(); foreach (int i in mi) Console.Write(i+"\t"); Console.ReadLine(); } } }
Комментарии