Оператор yield в C#

Перечисление представляет собой последовательность значений, которые программа может перечислить, например, используя цикл foreach. В C# вы можете использовать оператор yield, чтобы создать метод, который возвращает перечисление. Метод, который строит перечисление, должен возвращать тип IEnumerable. Он должен использовать yield return, чтобы указать значение, которое должно быть возвращено в перечислении.

Следующий код показывает, как этот пример создает метод Primes, который возвращает простые числа ниже заданного максимального значения.

// Возвращаем простые числа, используя Сито Эратосфена.
private static IEnumerable Primes(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 .

Итак, как это отличается от написания метода Primes, который просто создает List & lt; int & gt; или какую-либо другую коллекцию и заполняет ее значениями? Результат аналогичен, но метод очень отличается. Когда программа вызывает метод Primes, этот метод начинает выполняться. Когда этот метод выполняет инструкцию yield, элемент управления возвращается к вызывающему коду для обработки полученного значения. Когда цикл foreach переходит к следующему значению, элемент управления возвращается к методу Primes, чтобы он мог генерировать другое значение.

Источник: http://csharphelper.com/blog/2017/04/use-the-yield-statement-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector