我的一个朋友说,作为参数传递给Linq中的OrderBy()的委托函数对于每个元素仅评估一次。考虑以下情况:
var list2 = list.OrderBy(item => item.ComputationallyExpensiveFunction()).ToList();
ComputationallyExpensiveFunction()
是否真的定义为仅对列表中的每个元素进行一次评估,或者在某些情况下对于同一项目可以多次调用它?
答案 0 :(得分:4)
OrderBy
为每个项目调用一次委托,并缓存结果。
我在文档中找不到此行为的提法,因此我认为它不是指定的,但是实现确实做到了这一点(see referencesource)。
答案 1 :(得分: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