Новинки языка C#.NET - Итераторы
ОГЛАВЛЕНИЕ
Итераторы
Общеизвестно, что для того чтобы перебрать все элементы в некоторой коллекции используется метод foreach. Для тех, кто никогда не создавал собственные коллекции позволяющие перебирать элементы этот механизм был неизвестен, поэтому стоит описать процесс создания коллекции, поддерживающей последовательный перебор элементов с помощью синтаксиса foreach.
Для того, чтобы коллекция поддерживала foreach необходимо реализовать метод GetEnumerator, возвращающий специальный класс с помощью которого производится определения порядка вывода элементов. Для примера создадим коллекцию, при проходе с помощью foreach которой, элементы возвращаются в порядке их расположения в массиве.
public class MyUsualCollection
{
public int[] myItems;
public MyUsualCollection()
{
myItems = new int[10] { 1,2,3,4,5,6,7,8,9,10 };
}
public MyUsualEnumerator GetEnumerator()
{
return new MyUsualEnumerator(this);
}
}
// Класс Enumerator для нашей коллекции
public class MyUsualEnumerator
{
int indexEnum;
MyUsualCollection myCol;
public MyUsualEnumerator(MyUsualCollection col)
{
this.myCol = col;
indexEnum = -1;
}
public bool MoveNext()
{
indexEnum++; // перемещаемся дальше
return (indexEnum < this.myCol.myItems.GetLength(0));
}
public int Current
{
get
{
return (this.myCol.myItems[indexEnum]);
}
}
}
Очевидно, что для такой простой операции слишком много кода. Поэтому-то в C# с выходом Visual Studio 2005 и Framework 2 появился более простой путь поддержки перебора элементов. Того же результата мы добьемся написав следующий код:
public class MyIteratorCollection
{
public int[] myItems;
public MyIteratorCollection()
{
myItems = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
}
public IEnumerator GetEnumerator()
{
for (int i = 0; i < 10; i++)
yield return myItems[i];
}
}
Согласитесь, когда компилятор берет вашу работу на себя это приятно!