我想做这样的事情(如下),但是不确定是否有正式/优化的语法吗?
.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
。即使原始列表包含的条目少于200个,Concat
也会合并两个列表的所有条目。 Union
将仅添加来自last100的内容,但该内容尚未在top100中。一些尚不清楚但应考虑的事情:
IQueryable
,则建议使用ToArray()
或ToList()
,例如var sorted = list.OrderBy(i => i.Value).ToArray();
一开始。这样,仅对数据库执行一个查询,而其余查询在内存中完成。
Reverse
方法并未按我希望的方式进行优化,但这应该不是问题,因为在这里订购列表是真正的交易。对于记录来说,这里其他答案中解释的skip方法可能快一点,但是需要知道列表中的元素数量。 LinkedList
或另一个实现IList
的类,则Reverse
方法可以通过优化的方式来完成。