2013-03-04 159 views
-2

我有MyObject1列表:如何填充樹結構?

public class MyObject1 
{ 
    public int Id {get; set;} 
    public int ParentId {get; set;} 
} 

List<MyObject1> list = new List<MyObject1>(); 

我需要建立使用MyObject2樹:

public class MyObject2 
    { 
     public int Id {get; set;} 
     public int ParentId {get; set;} 
     // Here should be all child objects, that have .ParentId property is 
     // equal to .Id property of current node 
     public List<MyObject2> Children = new List<MyObject2>(); 
    } 

什麼是做到這一點的最快的方法?也許我應該在建築之前用IdParentId對我的list進行排序?

ETA 我嘗試:

MyObject2 root = MyObject2(1, 0); // in constructor id, parentId 

foreach (MyObject1 obj1 in list) 
{ 
    // Traversing all tree within root (let's say myTree), 
    //if myTree.ParentId = obj1.Id then: 

    myTree.Children.Add(new MyObject2(obj1.Id, obj1.ParentId)); 
} 

的問題是,如果什麼也沒有與樹這樣.Id還沒有任何物體? 這是最好的辦法嗎?

+0

您可能最擅長通過parentID然後在這些桶內編號 – Chris 2013-03-04 20:56:41

+0

您爲什麼要搜索'最快的方式'?你的方式不夠快?你有什麼嘗試? – I4V 2013-03-04 20:57:59

+0

@ I4V爲什麼我應該尋找最慢的方法來做到這一點?我是c#中的一名新成員,這就是爲什麼我問這個問題 – 2013-03-04 21:03:59

回答

2
List<MyObject2> result = new List<MyObject2>(){new MyObject2(1, 0)}; 
Dictionary<int, List<MyObject2>> dict = new Dictionary<int, List<MyObject2>>(); 

foreach (MyObject1 obj1 in list) 
{ 
    MyObject2 tmp = new MyObject2(obj1.Id, obj1.ParentId); 
    if (!dict.ContainsKey(tmp.ParentId)) 
    { 
     dict.Add(tmp.ParentId, new List<MyObject2>()); 
    } 
    dict[tmp.ParentId].Add(tmp); 
    result.Add(tmp); 
} 

foreach (MyObject2 obj2 in result) 
{ 
    if(dict.ContainsKey(obj2.Id)) 
     obj2.Children = dict[obj2.Id]; 
} 

請記住,如果你改變的dictList<MyObject2>,你也改變了相應的父的Children

+0

但是'result'將是第一個(根)級別的所有節點,並且它們將擁有它們的子對象,所以它就像是相同的節點將被重複兩次 – 2013-03-05 18:19:57

+0

'result'應該不是一個'List'但是一個根節點,每個其他節點都應該在'root.Children'等等中。而根節點是'new MyObject2(1,0)'。或者我誤解了一些東西? – 2013-03-05 20:03:37

+0

@William'result'不是最終的樹結構,而是一種循環遍歷節點的方式。一旦完成,每個節點的'Children'將被設置,並且'MyObject2 root = result [0];'你將擁有根節點。 – 2013-03-05 22:37:22