В исходнике не хватает ; после Select, а counter ошибочно вызывается как функция. После исправления в .NET 9 вывод: 5, 4, 0, 15.
Какой результат отобразит LINQ‑запрос с побочными эффектами и отложенным выполнением
В исходнике не хватает ; после Select, а counter ошибочно вызывается как функция. После исправления в .NET 9 вывод: 5, 4, 0, 15.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой текст будет напечатан в консоли? Какое значение получит переменная counter после выполнения кода?
using static System.Console;
int counter = 0;
var data = Enumerable.Range(0, 5)
.Select(index =>
{
counter++;
return index;
})
WriteLine(data.Count());
WriteLine(data.Max());
WriteLine(data.Min());
WriteLine(counter());
Ответ
В исходнике не хватает ; после Select, а counter ошибочно вызывается как функция. После исправления в .NET 9 вывод: 5, 4, 0, 15.
Range создаёт числа 0–4. Select отложен и не сохраняет результаты между перечислениями. В реализации .NET 9 вызов Count для такого Select также исполняет селектор для всех пяти элементов; Max и Min делают ещё по проходу. Поэтому counter увеличивается до 15.
Последнюю строку исправьте на WriteLine(counter);, а объявление data завершите ;. Если добавить ToArray сразу после Select, селектор выполнится один раз для каждого элемента и итоговый counter станет 5. Побочные эффекты внутри LINQ затрудняют чтение и зависят от способа потребления последовательности; явный цикл обычно понятнее.
Источник: raw.githubusercontent.com.