我想做这样的事情(如下),但不确定是否有正式/优化的语法可以这样做?
.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
还是Union
。 Concat
将合并两个列表的所有条目,即使存在相似的条目(如果您的原始列表包含少于 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/