«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
.