Оператор yield return в C#
Каждый yield return отдаёт один элемент и ставит метод на паузу до следующего MoveNext. Локальные переменные между шагами сохраняются: цикл продолжается с того же места, а не с начала метода.
Если метод отдаёт элементы через yield return, обычный return со значением в нём писать нельзя. Метод уже не возвращает готовую коллекцию, а выдаёт элементы по шагам.
Выведем чётные числа от 0 до max включительно, по одному на итерацию foreach. При max -1 цикл не выполнится ни разу:
static IEnumerable<int> Evens(int max)
{
for (int i = 0; i <= max; i += 2) yield return i;
}
foreach (int v in Evens(6)) Console.WriteLine(v); // выведет 0, 2, 4, 6
Сгенерируйте названия "north", "east" и "south" по одному и выведите их в одну строку.