我知道这可能是微优化,但我仍然想知道是否有任何不同的使用
var lastObject = myList.OrderBy(item => item.Created).Last();
或
var lastObject = myList.OrderByDescending(item => item.Created).First();
我正在寻找Linq to objects和Linq to Entities的答案。
6fe3ivhb1#
假设两种排序方式花费的时间相等(这是一个很大的“如果”),那么第一种方法将具有执行.Last()的额外成本,可能需要完整的枚举。对于面向SQL的LINQ来说,这个论点可能更有说服力。
.Last()
1tu0hz3e2#
(my答案是关于Linq to Objects,而不是Linq to Entities)我不认为这两条指令之间有很大的区别,这显然是一个微优化的案例。在这两种情况下,集合都需要排序,这通常意味着复杂度为O(n log n)。但是你可以很容易地得到同样的结果,复杂度为O(n),Jon Skeet在他的MoreLinq项目中以MaxBy扩展方法的形式提供了一个实现:
O(n log n)
O(n)
MaxBy
var lastObject = myList.MaxBy(item => item.Created);
vwoqyblh3#
很抱歉这没有直接回答你的问题,但是...为什么不做一个更好的优化并使用JonSkeet的MaxBy或MinBy实现呢?这将是O(n),而不是O(n log n)在你提出的两个替代方案。
m4pnthwp4#
在这两种情况下,它在一定程度上取决于您的底层集合。如果您预先了解集合在排序和选择之前的外观,您可以选择其中一个。例如,如果你知道列表是通常是升序(或主要是升序)排序顺序,你可以首选第一个选择。或者如果你知道你有SQL表上的索引是升序排序的。尽管SQL优化器可能无论如何都可以处理这个问题。在一般情况下,它们是等价的语句。你说这是微优化是对的。
scyqe7ek5#
假设OrderBy和OrderByDescending的平均性能相同,当元素数量很大时,取第一个元素的性能会比取最后一个元素的性能更好。
13z8s7eq6#
就我的两点意见:因为OrderBy或OrderByDescending无论如何都必须遍历所有对象,所以应该没有区别。然而,如果是我,我可能会用比较来遍历foreach中的所有项,以保存最高的比较项,这将是O(n)搜索,而不是排序的数量级。
OrderBy
OrderByDescending
foreach
brc7rcf07#
为了给予一个更新的答案(因为.Net是一个不断发展的生态系统),在.Net6中引入了以下内容https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.maxby?view=net-6.0对于你的问题
将转向
执行时间O(n)
7条答案
按热度按时间6fe3ivhb1#
假设两种排序方式花费的时间相等(这是一个很大的“如果”),那么第一种方法将具有执行
.Last()
的额外成本,可能需要完整的枚举。对于面向SQL的LINQ来说,这个论点可能更有说服力。
1tu0hz3e2#
(my答案是关于Linq to Objects,而不是Linq to Entities)
我不认为这两条指令之间有很大的区别,这显然是一个微优化的案例。在这两种情况下,集合都需要排序,这通常意味着复杂度为
O(n log n)
。但是你可以很容易地得到同样的结果,复杂度为O(n)
,Jon Skeet在他的MoreLinq项目中以MaxBy
扩展方法的形式提供了一个实现:vwoqyblh3#
很抱歉这没有直接回答你的问题,但是...
为什么不做一个更好的优化并使用JonSkeet的MaxBy或MinBy实现呢?
这将是O(n),而不是O(n log n)在你提出的两个替代方案。
m4pnthwp4#
在这两种情况下,它在一定程度上取决于您的底层集合。如果您预先了解集合在排序和选择之前的外观,您可以选择其中一个。例如,如果你知道列表是通常是升序(或主要是升序)排序顺序,你可以首选第一个选择。或者如果你知道你有SQL表上的索引是升序排序的。尽管SQL优化器可能无论如何都可以处理这个问题。
在一般情况下,它们是等价的语句。你说这是微优化是对的。
scyqe7ek5#
假设OrderBy和OrderByDescending的平均性能相同,当元素数量很大时,取第一个元素的性能会比取最后一个元素的性能更好。
13z8s7eq6#
就我的两点意见:因为
OrderBy
或OrderByDescending
无论如何都必须遍历所有对象,所以应该没有区别。然而,如果是我,我可能会用比较来遍历foreach
中的所有项,以保存最高的比较项,这将是O(n)搜索,而不是排序的数量级。brc7rcf07#
为了给予一个更新的答案(因为.Net是一个不断发展的生态系统),在.Net6中引入了以下内容
https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.maxby?view=net-6.0
对于你的问题
将转向
执行时间
O(n)