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实现,但这看起来有点过分).
排序很智能,因为它只会对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。)