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

.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方法可以通过优化的方式来完成。
  • 08-17 14:55