Оператор yield в C#
Перечисление представляет собой последовательность значений, которые программа может перечислить, например, используя цикл foreach. В C# вы можете использовать оператор yield, чтобы создать метод, который возвращает перечисление. Метод, который строит перечисление, должен возвращать тип IEnumerable. Он должен использовать yield return, чтобы указать значение, которое должно быть возвращено в перечислении.
Следующий код показывает, как этот пример создает метод Primes, который возвращает простые числа ниже заданного максимального значения.
// Возвращаем простые числа, используя Сито Эратосфена. private static IEnumerablePrimes(int max) { bool[] not_prime = new bool[max + 1]; for (int i = 2; i <= max; i++) { // Посмотрим, является ли i простым. if (!not_prime[i]) { // Число i является простым. Верни это. //Console.WriteLine("Yielding "+ i); yield return i; // Выбиваем кратные i. for (int j = i * 2; j <= max; j += i) not_prime[j] = true; } } }
В этом примере метод static, потому что ему не нужно ничего знать о форме, но в общем случае метод перечисления не должен быть static.. р>
Метод возвращает перечисление целых чисел, поэтому его возвращаемый тип IEnumerable & lt; int & gt;.
В коде используется сито Эратосфена для нахождения простых чисел. Для объяснения этого метода см. Используйте сито Эратосфена, чтобы найти простые числа в C# .
Единственная разница между этой программой и предыдущей заключается в том, что делает метод, когда он находит премьер. Вместо прямого добавления значения в форму ListBox формы, метод перечисления использует оператор yield return, чтобы добавить значение в перечисление.
Следующий код показывает, как программа использует перечисление.
// Заполните ListBox пробелами. private void Form1_Load(object sender, EventArgs e) { foreach (int prime in Primes(250)) { //Console.WriteLine("Got "+ prime); lstPrimes.Items.Add(prime); } }
Когда форма загружается, этот код использует цикл foreach для перечисления значений, возвращаемых методом Primes, добавляя их в форму ListBox tt >. р>
Итак, как это отличается от написания метода Primes, который просто создает List & lt; int & gt; или какую-либо другую коллекцию и заполняет ее значениями? Результат аналогичен, но метод очень отличается. Когда программа вызывает метод Primes, этот метод начинает выполняться. Когда этот метод выполняет инструкцию yield, элемент управления возвращается к вызывающему коду для обработки полученного значения. Когда цикл foreach переходит к следующему значению, элемент управления возвращается к методу Primes, чтобы он мог генерировать другое значение.