Итераторы (руководство по программированию в C#)

Обновлен: Ноябрь 2007

Итератор — метод доступа get или оператор, выполняющий настраиваемую итерацию класса массива или коллекции с помощью ключевого слова yield. При использовании оператора return ключевого слова yield элемент в исходной последовательности немедленно возвращается вызывающему объекту до того, как будет получен доступ к следующему элементу. Хотя итератор создается как метод, компилятор переводит его во вложенный класс, который фактически является конечным автоматом. Данный класс отслеживает положения итератора, пока в клиентском коде выполняется цикл foreach.

dscyy5s0.alert_note(ru-ru,VS.90).gifПримечание.

Чтобы просмотреть скрытые операции компилятора, воспользуйтесь средством ILDASM.exe для отображения кода промежуточного языка, создаваемого для метода итератора.

Итератор вызывается из клиентского кода с помощью оператора foreach. Например, можно создать итератор для класса, возвращающего элементы в обратном порядке или выполняющего операцию над каждым элементом перед тем, как итератор возвратит его. При создании итератора для класса или структуры реализация всего интерфейса IEnumerator не требуется. Когда компилятор обнаруживает итератор, он автоматически создает методы Current, MoveNext и Dispose интерфейса IEnumerator или IEnumerator<T>.

Общие сведения о итераторах

  • Итератор — это раздел кода, возвращающий упорядоченную последовательность значений одинакового типа.

  • Итератор может использоваться в качестве основной части метода, оператора или метода доступа get.

  • В коде итератора используется оператор yield return для возвращения каждого элемента по очереди. Ключевое слово yield break завершает итерацию.

  • В классе можно реализовать несколько итераторов. Каждый итератор должен иметь уникальное имя, как и любой член класса, и может вызываться клиентским кодом в операторе foreach: foreach(int x in SampleClass.Iterator2){}.

  • Тип возвращаемого итератором значения должен быть IEnumerable, IEnumerator, IEnumerable<T> или IEnumerator<T>.

  • Итераторы используются для обеспечения отложенного выполнения в запросах LINQ.

Ключевое слово yield используется для указания возвращаемого значения или значений. При подходе к оператору yield return текущее положение сохраняется. При следующем вызове итератора выполнение возобновляется с этого места.

Итераторы также удобно использовать с классами коллекций, так как это обеспечивает простой способ итерации сложных структур данных, например двоичных деревьев.

Связанные разделы

Дополнительные сведения см. в следующих разделах.

Пример

В данном примере класс DaysOfTheWeek является простым классом коллекций, который содержит дни недели в виде строк. После каждой итерации цикла foreach возвращается следующая строка в коллекции.

public class DaysOfTheWeek : System.Collections.IEnumerable
{
    string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

    public System.Collections.IEnumerator GetEnumerator()
    {
        for (int i = 0; i < days.Length; i++)
        {
            yield return days[i];
        }
    }
}

class TestDaysOfTheWeek
{
    static void Main()
    {
        // Create an instance of the collection class
        DaysOfTheWeek week = new DaysOfTheWeek();

        // Iterate with foreach
        foreach (string day in week)
        {
            System.Console.Write(day + " ");
        }
    }
}
// Output: Sun Mon Tue Wed Thr Fri Sat

Спецификация языка C#

Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:

  • 10.14 Итераторы

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Универсальные шаблоны (Руководство по программированию на C#)