2017-02-27 32 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