Итераторы - это простой способ генерировать последовательность элементов, без необходимости реализовывать IEnumerable<T>
/ IEnumerator<T>
самостоятельно.Итератор - это метод, который возвращает IEnumerable<T>
, который можно перечислить в цикле foreach.
Вот простой пример:
public IEnumerable<string> GetNames()
{
yield return "Joe";
yield return "Jack";
yield return "Jane";
}
foreach(string name in GetNames())
{
Console.WriteLine(name);
}
Обратите внимание на операторы yield return
: этот оператор donна самом деле не возвращаются из метода, они просто «передают» следующий элемент тому, кто читает реализацию.
Когда компилятор встречает блок итератора, он фактически переписывает его в конечный автомат в классе, который реализуетIEnumerable<T>
и IEnumerator<T>
.Каждый оператор yield return
в итераторе соответствует состоянию в этом автомате.
См. эту статью Джона Скита для получения более подробной информации об итераторах.