Какой результат отобразит LINQ‑запрос с побочными эффектами и отложенным выполнением

В исходнике не хватает ; после Select, а counter ошибочно вызывается как функция. После исправления в .NET 9 вывод: 5, 4, 0, 15.

Короткий ответ

Что ответить на собеседовании

В исходнике не хватает ; после 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее