我知道这可能是微优化,但我仍然想知道使用
是否有任何区别var lastObject = myList.OrderBy(item => item.Created).Last();
或
var lastObject = myList.OrderByDescending(item => item.Created).First();
我正在寻找Linq to objects和Linq to Entities的答案。
答案 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)
答案 4 :(得分:1)
假设OrderBy和OrderByDescending的平均性能相同,当元素数量很大时,第一个元素的效果会比最后一个要好。
答案 5 :(得分:1)
只是我的两分钱:因为OrderBy
或OrderByDescending
必须遍历所有对象,所以应该没有区别。然而,如果是我,我可能只是循环遍历foreach
中的所有项目并进行比较以保持最高比较项目,这将是O(n)搜索而不是排序的任何数量级。 。