c# - 使用LINQ取前100名和后100名?

标签 c# linq

我想做这样的事情(如下),但不确定是否有正式/优化的语法可以这样做?

.Orderby(i => i.Value1)
.Take("Bottom 100 & Top 100")
.Orderby(i => i.Value2);

基本上,我想按一个变量排序,然后取前 100 个和后 100 个,然后按另一个变量对这些结果进行排序。

有什么建议吗?

最佳答案

var sorted = list.OrderBy(i => i.Value);
var top100 = sorted.Take(100);
var last100 = sorted.Reverse().Take(100);
var result = top100.Concat(last100).OrderBy(i => i.Value2);

不知道你最后要Concat还是UnionConcat 将合并两个列表的所有条目,即使存在相似的条目(如果您的原始列表包含少于 200 个条目,情况就是如此)。 Union 只会添加 last100 中尚未进入 top100 的内容。

一些不清楚但应该考虑的事情:

  • 如果 list 是数据库的 IQueryable,建议使用 ToArray()ToList (),例如

    var sorted = list.OrderBy(i => i.Value).ToArray();
    

    一开始。这样一来,只对数据库进行一次查询,其余的都在内存中完成。

  • Reverse 方法没有按照我希望的方式进行优化,但这应该不是问题,因为对列表进行排序才是真正的问题。不过,为了记录,此处其他答案中解释的 skip 方法可能要快一点,但需要知道 list 中的元素数量。

  • 如果 list 是一个 LinkedList 或另一个实现 IList 的类,则 Reverse 方法可以以优化的方式完成。

关于c# - 使用LINQ取前100名和后100名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25103508/

相关文章:

c# - 工作框架;在代码隐藏中在路径标记语法和几何图形之间转换

c# - 在类里面使用相同类型的列表是一个好的做法吗?

C#合并两个对象列表

vb.net - VB Linq中的“New…With”语法有什么作用?

c# - 从 ViewModel 打开一个窗口

c# - 创建一个在 ASP.NET 中自行执行的页面

c# - 比较linq中的char

c# - 连接两个具有匿名类型的 IQueryable?

c# - 使用默认属性路径的 LINQ XML 搜索失败

c# - 没有从 visual studio 2015 中的文件中获取选项 sqlite 数据库