Что выведет код 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 ошибок.