c# - 如何使用 O(n) 中的 LINQ 根据特定顺序查找第一项?

标签 c# linq complexity-theory sql-order-by

假设我有一个项目列表(例如,帖子),我想根据一些重要的顺序(例如,PublishDate,然后是 CommentsCount 作为决胜局)找到第一个项目。 使用 LINQ 执行此操作的自然方法如下:

posts.OrderBy(post => post.PublishDate).ThenBy(post => post.CommentsCount).First()

但是,我的微优化器担心调用 OrderBy 实际上会花费我 O(n*lgn) 来对整个列表进行排序,而我真正需要的是 O(n) 查找最小值操作。

那么,LINQ 是否足够聪明,可以从知道如何优化后续 First() 调用的 OrderBy() 返回一些东西?如果没有,开箱即用的更好方法是什么? (我总是可以编写自己的 FindMinimumItem 实现,但这似乎有点矫枉过正)。

最佳答案

排序很聪明,因为它只会对 OrderBy 的第一组执行 ThenBy,但 OrderBy 仍然在返回第一组之前必须对所有项目进行排序。

您可以使用聚合方法根据自定义比较获取第一篇文章:

Post lowest =
  posts.Aggregate((Post)null,
    (x, y) =>
      x == null
      || y.PublishDate < x.PublishDate
      || (y.PublishDate == x.PublishDate && y.CommentsCount < x.CommentsCount)
      ? y : x
  );

(假设您正在使用 LINQ to Objects 当然。)

关于c# - 如何使用 O(n) 中的 LINQ 根据特定顺序查找第一项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2260654/

相关文章:

c# - 从 Enum 创建字典<Enum, int>

c++ - 内存使用对算法复杂度的影响

algorithm - 动态规划-复杂性

algorithm - 最小化分发糖果的步骤

c# - 在 C# 和 Xamarin 开发的移动应用程序上使用 Braintree

c# - 无法将 lambda 表达式转换为类型 'string',因为它不是委托(delegate)类型 - OrderBy 和 DbGeography by ref

c# - webform c# 中的 datagridview 在页脚中显示查询

c# - Release模式下的无限循环

c# - 使用 LINQ 我有一个列表列表,如何选择每个列表中存在的所有对象?

c# - 如何从 Linq 中的配置文件的 Appsettings 获取键和值