OrderBy可以为一个元素多次评估委托吗?

时间:2019-04-22 10:08:17

标签: c# linq sorting

我的一个朋友说,作为参数传递给Linq中的OrderBy()的委托函数对于每个元素仅评估一次。考虑以下情况:

var list2 = list.OrderBy(item => item.ComputationallyExpensiveFunction()).ToList();

ComputationallyExpensiveFunction()是否真的定义为仅对列表中的每个元素进行一次评估,或者在某些情况下对于同一项目可以多次调用它?

2 个答案:

答案 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