Что выведет код Middle Коллекции и LINQ обновлено

Побочные эффекты в Select

Вопрос

Что выведет программа (.NET 8)? По строке на каждый вывод.

int calls = 0;
var q = Enumerable.Range(1, 3).Select(x => { calls++; return x * 2; });
var first = q.First();
Console.WriteLine(calls);
var list = q.ToList();
Console.WriteLine(calls);
Console.WriteLine(q.Count());
Console.WriteLine(calls);

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 1, 4, 3, 7. First останавливается на первом элементе: 1 вызов.

Что выведет

1
4
3
7

Разбор

First останавливается на первом элементе: 1 вызов. ToList перечисляет заново все 3 элемента: 4. Count() у такой цепочки знает размер источника (Range из трёх чисел), но всё равно вызывает селектор для каждого элемента, чтобы не потерять его побочные эффекты: 7, а сам Count равен 3. Мораль: побочные эффекты в LINQ не пишут, число вызовов селектора зависит от того, какие операторы и сколько раз перечисляют запрос.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.