如何填充树结构?

时间:2013-03-04 20:54:05

标签: c# tree

我有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>();
    }

最快的方法是什么?也许我应该在构建之前按listIdParentId进行排序?

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的对象呢? 这是最好的方法吗?

1 个答案:

答案 0 :(得分: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];
}

请注意,如果您更改List<MyObject2> dict,则还要更改相应父级的Children