P
P
ProblemBook.NET
Search…
⌃K

«EnumerableToArray» (Решение)

Ответ

GetString: Foo
EnumerableToArray: Foo
GetString: Bar
EnumerableToArray: Bar
GetString: Foo
GetString: Bar

Объяснение

LINQ-запросы являются ленивыми, т.е. реализуют отложенное исполнение. Это означает, что если сфомировать запрос и не вызвать для него явно метод вроде ToArray() или ToList(), то выполнение запроса будет отложено до того момента, пока мы явно не затребуем результатов. Таким образом, строка
var strings = GetStringEnumerable();
не выведет на консоль ничего. Далее, в цикле
foreach (var s in strings)
Console.WriteLine("EnumerableToArray: " + s);
произойдёт выполнение запроса. Причём, сначала выполнится первый yield (вывод строки GetString: Foo), а после него выполнится тело цикла для первого значения перечисления (вывод строки EnumerableToArray: Foo). Далее, цикл foreach запросит второй элемент перечисления, будет выполнен второй yield (вывод строки GetString: Bar) и второй раз будет выполнено тело цикла для полученного элемента (вывод строки EnumerableToArray: Bar).
Далее следует строка
return strings.ToArray();
Тут можно наблюдать повторное исполнение LINQ-запроса, а значит мы вновь произойдёт вывод строк GetString: Foo и GetString: Bar.