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

Avi*_*ish 7 c# linq complexity-theory sql-order-by

假设我有一个项目列表(例如,帖子),我想根据一些非平凡的顺序找到第一个项目(例如,PublishDate然后将CommentsCount作为打破平局).使用LINQ执行此操作的自然方式如下:

posts.OrderBy(post => post.PublishDate).ThenBy(post => post.CommentsCount).First()
Run Code Online (Sandbox Code Playgroud)

然而,我的微优化器担心调用OrderBy实际上花费我O(n*lgn)来排序整个列表,当我真正需要的是O(n)find-minimum操作时.

那么,LINQ是否足够智能从OrderBy()返回一些知道如何优化后续First()调用的东西?如果没有,开箱即用的更好的方法是什么?(我总是可以编写自己的FindMinimumItem实现,但这看起来有点过分).

Guf*_*ffa 2

排序很智能,因为它只会对ThenBy中的第一组进行排序OrderBy,但OrderBy仍然必须对所有项目进行排序才能返回第一组。

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

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

(当然假设您使用的是 LINQ to Objects。)