我有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>();
}
最快的方法是什么?也许我应该在构建之前按list
或Id
对ParentId
进行排序?
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 :(得分: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
。