OrderBy()。Last()或OrderByDescending()。First()性能

时间:2011-07-13 14:37:46

标签: c# .net linq

我知道这可能是微优化,但我仍然想知道使用

是否有任何区别
var lastObject = myList.OrderBy(item => item.Created).Last();

var lastObject = myList.OrderByDescending(item => item.Created).First();

我正在寻找Linq to objects和Linq to Entities的答案。

6 个答案:

答案 0 :(得分:17)

假设两种排序方式花费相同的时间(并且这是一个很大的'if'),那么第一种方法会产生额外的.Last()成本,可能需要完整的枚举。

对于面向SQL的LINQ,这个论点可能更强大。

答案 1 :(得分:6)

(我的答案是关于Linq to Objects,而不是Linq to Entities)

我不认为这两条指令之间存在很大差异,这显然是微优化的一个例子。在这两种情况下,都需要对集合进行排序,这通常意味着O(n log n)的复杂性。但是,通过枚举集合并跟踪最小值或最大值,您可以轻松地获得具有O(n)复杂度的相同结果。 Jon Skeet以MaxBy扩展方法的形式在他的MoreLinq项目中提供了一个实现:

var lastObject = myList.MaxBy(item => item.Created);

答案 2 :(得分:3)

在这两种情况下,它在某种程度上取决于您的基础集合。如果您事先了解集合在订单之前的外观,那么您可以选择一个而不是另一个。例如,如果您知道列表是通常,则以升序(或大多数升序)排序顺序,您可能更喜欢第一个选择。或者,如果您知道SQL表上的索引是按升序排序的。虽然SQL优化器无论如何都可能处理它。

在一般情况下,它们是等同的陈述。当你说它是微观优化时你是对的。

答案 3 :(得分:3)

对不起,这不能直接回答你的问题,但是......

为什么不做更好的优化并使用Jon Skeet的MaxByMinBy实现?

在你提出的两个备选方案中,这将是O(n)而不是O(n log n)。

答案 4 :(得分:1)

假设OrderBy和OrderByDescending的平均性能相同,当元素数量很大时,第一个元素的效果会比最后一个要好。

答案 5 :(得分:1)

只是我的两分钱:因为OrderByOrderByDescending必须遍历所有对象,所以应该没有区别。然而,如果是我,我可能只是循环遍历foreach中的所有项目并进行比较以保持最高比较项目,这将是O(n)搜索而不是排序的任何数量级。 。