Поиск…


замечания

Итератором является метод, get accessor или оператор, который выполняет пользовательскую итерацию по массиву или классу коллекции, используя ключевое слово yield

Пример простого числового итератора

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

Это возможно, потому что массивы реализуют интерфейс IEnumerable , позволяя клиентам получать итератор для массива с использованием метода GetEnumerator() . Этот метод возвращает перечислитель , который является курсором только для чтения, только для каждого числа в массиве.

int[] numbers = { 1, 2, 3, 4, 5 };

IEnumerator iterator = numbers.GetEnumerator();

while (iterator.MoveNext())
{
    Console.WriteLine(iterator.Current);
}

Выход

1
2
3
4
5

Также можно добиться тех же результатов, используя оператор foreach :

foreach (int number in numbers)
{
    Console.WriteLine(number);
}

Создание итераторов с использованием урожая

Итераторы продуцируют счетчики. В C # перечисления производятся путем определения методов, свойств или индексаторов, содержащих операторы yield .

Большинство методов возвращают управление своим вызывающим абонентам через обычные операторы return , которые располагают всем локальным данным для этого метода. Напротив, методы, которые используют операторы yield позволяют им возвращать несколько значений вызывающему по запросу, сохраняя при этом локальное состояние между этими возвращаемыми значениями. Эти возвращаемые значения представляют собой последовательность. В итераторах используются два типа операторов yield :

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

  • yield break , который функционирует аналогично нормальному оператору return - это означает конец последовательности. Нормальные операторы return сами являются незаконными в блоке итератора.

В приведенном ниже примере показан метод итератора, который может быть использован для генерации последовательности Фибоначчи :

IEnumerable<int> Fibonacci(int count)
{
    int prev = 1;
    int curr = 1;
    
    for (int i = 0; i < count; i++)
    {
        yield return prev;
        int temp = prev + curr;
        prev = curr;
        curr = temp;
    }
}

Этот итератор затем может быть использован для создания перечислителя последовательности Фибоначчи, который может быть использован вызывающим методом. В приведенном ниже коде показано, как можно перечислять первые десять членов в последовательности Фибоначчи:

void Main()
{
    foreach (int term in Fibonacci(10))
    {
        Console.WriteLine(term);
    }
}

Выход

1
1
2
3
5
8
13
21
34
55


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow