Оператор yield
В методе, который возвращает
IEnumerable или IEnumerable<T>,
можно писать yield return с очередным
значением. Компилятор строит итератор: код
после yield return возобновляется при
следующем шаге перечисления. Для типизированного
варианта нужен using System.Collections.Generic.
Синтаксис
yield return выражение;
yield break;
Пример
Давайте отдадим три числа и выведем их в foreach:
using System;
using System.Collections.Generic;
class Program
{
static IEnumerable<int> GetNums()
{
yield return 1;
yield return 2;
yield return 3;
}
static void Main()
{
foreach (int num in GetNums())
{
Console.WriteLine(num);
}
}
}
Результат выполнения кода:
1
2
3
Пример
Давайте отдадим элементы из цикла:
using System;
using System.Collections.Generic;
class Program
{
static IEnumerable<int> GetRange(int count)
{
for (int i = 1; i <= count; i++)
{
yield return i;
}
}
static void Main()
{
foreach (int num in GetRange(3))
{
Console.WriteLine(num);
}
}
}
Результат выполнения кода:
1
2
3
Пример
Давайте завершим перечисление через yield break:
using System;
using System.Collections.Generic;
class Program
{
static IEnumerable<int> GetNums()
{
yield return 1;
yield break;
yield return 2;
}
static void Main()
{
foreach (int num in GetNums())
{
Console.WriteLine(num);
}
}
}
Результат выполнения кода:
1
Пример
Давайте отдадим строки и выведем каждую:
using System;
using System.Collections.Generic;
class Program
{
static IEnumerable<string> GetLines()
{
yield return "abcde";
yield return "12345";
}
static void Main()
{
foreach (string line in GetLines())
{
Console.WriteLine(line);
}
}
}
Результат выполнения кода:
"abcde"
"12345"
Смотрите также
-
цикл
foreach,
которым обходят результат итератора -
await foreach,
который ждёт элементы асинхронного потока -
локальная функция,
внутри которой тоже можно писатьyield -
оператор
return,
который завершает обычный метод сразу