#c# #linq #sorting
#c# #linq #сортировка
Вопрос:
Мой друг сказал, что функция делегирования, переданная в качестве параметра OrderBy() в Linq, оценивается только один раз для каждого элемента. Рассмотрим следующий случай:
var list2 = list.OrderBy(item => item.ComputationallyExpensiveFunction()).ToList();
ComputationallyExpensiveFunction()
Действительно ли определено, что оно оценивается только один раз для каждого элемента в списке, или есть случаи, когда его можно вызывать более одного раза для одного и того же элемента?
Ответ №1:
OrderBy
вызывает делегат один раз для каждого элемента и кэширует результат.
Я не могу найти упоминания об этом поведении в документах, поэтому я не думаю, что оно указано, но реализация делает это (см. referencesource ).
Ответ №2:
Только один раз. Вы можете подтвердить это, выполнив это:
var result = new int[] { 5, 3, 1, 4, 2 }.OrderBy(item =>
{
Thread.Sleep(500);
Console.WriteLine(item);
return item;
});
Console.WriteLine(String.Join(", ", result));
Вывод:
5
3
1
4
2
1, 2, 3, 4, 5