2017-02-27 31 views
0

我有以下值的集合:LINQ - 排序多个列

ID | OtherId 
1 0 
2 0 
3 1 
3 2 
3 3 
4 1 
4 2 
4 3 
5 0 
6 0 

有没有办法让在使用LINQ下面的排序方式输出?

ID | OtherId 
1 0 
2 0 
3 1 
4 1 
3 2 
4 2 
3 3 
4 3 
5 0 
6 0 
+0

使用** **的OrderBy条款 – dmitry

+2

我怀疑预期的结果是否是有序列表?如果是,为什么[5 0]和[6 0]不应该跟随[1 0]和[2 0]对或者它应该是第一列排序,不是吗? –

+0

你需要解释规则是什么。就目前而言,你的问题是无法回答的,因为你没有给我们足够的信息来说明排序标准是什么。 –

回答

0

你需要使用的OrderBy和ThenBy:

我没有试过,但是因为你的最后2行是“乱序”您需要通过一阶(未)具体值,然后按列。这将是这样的:

var sorted = table 
      .Where(x => x.SomeColumn == someValue) 
      .OrderBy(x => x.ID != 5) 
      .ThenBy(x => x.ID != 6) 
      .ThenBy(x => x.OtherId) 
      .ThenBy(x => x.ID) 
      .ToList(); 

如果你不想通过具体的值进行排序,你需要做2个查询和工会:

var valueAtWhichSortingLogicChanges = 4; 
var sorted = table 
      .Where(x => x.ID <= valueAtWhichSortingLogicChanges) 
      .OrderBy(x => x.OtherId) 
      .ThenBy(x => x.ID) 
      .ToList(); 

sorted.AddRange(table 
      .Where(x => x.ID > valueAtWhichSortingLogicChanges) 
      .OrderBy(x => x.OtherId) 
      .ThenBy(x => x.ID) 
      .ToList()); 
+0

这将首先按“OtherId”排序,然后按“Id”排序。这并没有给出预期的结果。因为我需要基于两列的排序列表。查看输出列表。 – Rex

+0

有没有办法实现这个没有硬编码任何值?因为我的收藏将具有随机值。以上只是一个样本来理解问题。 – Rex

+0

@Rakshith,我不确定你明白为什么你的排序不能在没有硬编码的情况下完成。没有合乎逻辑的排序可以说:“按第二列排序,然后按第一列排序,除非第一列大于4.然后把这些排在最后,然后按第二列排序,然后排在第一列。那有意义吗? – Forklift