2013-03-04 3 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>(); 
    } 

Какой самый быстрый способ сделать это? Может быть, мне нужно отсортировать мой 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

Возможно, вам будет лучше сортировать по parentID, а затем Id в этих ковших – Chris

+0

Почему вы ищете «самый быстрый способ»? ваш путь не достаточно быстрый? Что вы пробовали? – I4V

+0

@ I4V Почему я должен искать самый медленный способ сделать это? Я новичок в C#, поэтому я прошу об этом –

ответ

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 соответствующего родителя.

+0

Но в 'result' будут все узлы на первом (корневом) уровне, и они будут иметь свои дочерние объекты, так что это похоже на то, что одни и те же узлы будут повторяться дважды –

+0

' result' не должно быть «Список», но один корневой узел, а все остальные узлы должны находиться в «root.Children» и т. д. И корневой узел - это новый MyObject2 (1, 0) '. Или, может быть, я что-то неправильно понимаю? –

+0

@William 'result' - не окончательная древовидная структура, а способ петли над узлами. Как только это будет сделано, «Дети» каждого узла будут установлены, а с «MyObject2 root = result [0];» у вас будет корневой узел. –

Смежные вопросы