Может ли OrderBy оценивать делегирование более одного раза для элемента?

#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