C# Language
итераторы
Поиск…
замечания
Итератором является метод, 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