.net OrderBy().Last()或OrderByDescending().First()性能

ryoqjall  于 2023-03-24  发布在  .NET
关注(0)|答案(7)|浏览(147)

我知道这可能是微优化,但我仍然想知道是否有任何不同的使用

var lastObject = myList.OrderBy(item => item.Created).Last();

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

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

6fe3ivhb

6fe3ivhb1#

假设两种排序方式花费的时间相等(这是一个很大的“如果”),那么第一种方法将具有执行.Last()的额外成本,可能需要完整的枚举。
对于面向SQL的LINQ来说,这个论点可能更有说服力。

1tu0hz3e

1tu0hz3e2#

(my答案是关于Linq to Objects,而不是Linq to Entities)
我不认为这两条指令之间有很大的区别,这显然是一个微优化的案例。在这两种情况下,集合都需要排序,这通常意味着复杂度为O(n log n)。但是你可以很容易地得到同样的结果,复杂度为O(n),Jon Skeet在他的MoreLinq项目中以MaxBy扩展方法的形式提供了一个实现:

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

vwoqyblh3#

很抱歉这没有直接回答你的问题,但是...
为什么不做一个更好的优化并使用JonSkeet的MaxByMinBy实现呢?
这将是O(n),而不是O(n log n)在你提出的两个替代方案。

m4pnthwp

m4pnthwp4#

在这两种情况下,它在一定程度上取决于您的底层集合。如果您预先了解集合在排序和选择之前的外观,您可以选择其中一个。例如,如果你知道列表是通常是升序(或主要是升序)排序顺序,你可以首选第一个选择。或者如果你知道你有SQL表上的索引是升序排序的。尽管SQL优化器可能无论如何都可以处理这个问题。
在一般情况下,它们是等价的语句。你说这是微优化是对的。

scyqe7ek

scyqe7ek5#

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

13z8s7eq

13z8s7eq6#

就我的两点意见:因为OrderByOrderByDescending无论如何都必须遍历所有对象,所以应该没有区别。然而,如果是我,我可能会用比较来遍历foreach中的所有项,以保存最高的比较项,这将是O(n)搜索,而不是排序的数量级。

brc7rcf0

brc7rcf07#

为了给予一个更新的答案(因为.Net是一个不断发展的生态系统),在.Net6中引入了以下内容
https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.maxby?view=net-6.0
对于你的问题

var lastObject = myList.OrderBy(item => item.Created).Last();

将转向

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

执行时间O(n)

相关问题