2012-06-10 69 views
0

爲樹狀排序我有一個列表名單通過LINQ

key ParentKey 
1 Null 
2 1 
3 Null 
4 Null 
5 1 
6 4 
7 6 
8 3 

我想在

key ParentKey 
1 Null 
2 1 
5 1 
3 Null 
8 3 
4 Null 
6 4 
7 6 

通過LINQ排序如何才能做到這一點? 任何幫助是最惠康

+0

請你能解釋一下你嘗試過什麼? –

+0

我沒有任何想法如何開始甚至...我可以使用循環來完成工作,但我想通過linq – thewayman

回答

1

假設的結果應該是:

key ParentKey 
1 Null 
2 1 
5 1 
3 Null 
8 3 
4 Null 
6 4 
7 6 

我可以說,如果沒有,使該位置的空值到一個邏輯,你不能做任何事情列表。

所以使用LINQ可以使用OrderBy()功能對列表進行排序:

list = list.OrderBy(x => x.ParentKey).ToList(); 

但是使用這個功能,結果如下:

key ParentKey 
1 Null 
3 Null 
4 Null 
2 1 
5 1 
8 3 
6 4 
7 6 
+0

做到這一點我已經知道... – thewayman

0

我相信你想在這裏實現什麼一個DFS命令打印一棵樹。
Linq幫不了你(至少開箱即可)。

我建議適應DFS實現到您的數據結構。見Eric Lippert's suggestion

1

,如果你有

public class MyObject{ 
     int Key {get;set;} 
     int ? ParentKey{get;set;} 
} 

一個名單,然後進行排序此列表使用:

var list = new List<MyObject>(){ new MyObject{ Key = 1 , ParentKey = null } , new MyObject{Key=2 , PatentKey = 1} /* and so on */}; 

    var sortedList = list.OrderBy(o=>o.ParentKey , new MyComparer()); 



public class MyComparer : IComparer<MyObject> 
{  
    public int Compare(MyObject o1, MyObject o2) 
    { 
     if (ol.HasValue && o2.HasValue) 
     { 
      if (ol.ParentKey.Value == o2.ParentKey.Value) 
       return 0; 
      return ol.ParentKey.Value > o2.ParentKey.Value ? 1 : -1; 
     } 
     else 
      return 0; 

    } 
} 

這將產生精確的期望序列

+0

沒有工作:( – thewayman

+0

結果是什麼?你可以在Compare類中做一些改變,以獲得預期的結果。你試過了嗎? –

+0

我最近編輯過代碼,請檢查一下是否使用了最後一次更改。 –