Реализация интерфейсов IEnumerable и IEnumerator
79C# --- Руководство по C# --- Реализация интерфейсов 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();
}
}
}