2013-03-04 4 views
-2

J'ai une liste de MyObject1:Comment remplir une arborescence?

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

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

Je dois construire un arbre à l'aide 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>(); 
    } 

Quelle est la façon la plus rapide de le faire? Peut-être que je devrais trier mon list par Id ou ParentId avant de construire?

ETA Mon essai:

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)); 
} 

Le problème est que s'il n'y a pas un objet avec un tel .Id dans l'arbre encore? C'est le meilleur moyen d'y arriver?

+0

Vous préférerez probablement trier par parentID & Id dans ces compartiments. – Chris

+0

Pourquoi recherchez-vous la méthode la plus rapide? votre chemin n'est pas assez rapide? Qu'avez-vous essayé? – I4V

+0

@ I4V Pourquoi devrais-je chercher le moyen le plus lent de le faire? Je suis un nouveau dans C#, c'est pourquoi je le demande –

Répondre

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]; 
} 

Gardez à l'esprit que si vous changez un List<MyObject2> de dict, vous changez aussi la Children du parent correspondant.

+0

Mais dans 'result', tous les nœuds seront au premier niveau (racine), et ils auront leurs objets enfants, donc c'est comme si les mêmes nœuds étaient répétés deux fois –

+0

' result' ne devrait pas être un 'List' mais un seul nœud racine, et tous les autres nœuds devraient être dans' root.Children', etc. Et le nœud racine est 'new MyObject2 (1, 0)'. Ou peut-être que je me méprends quelque chose? –

+0

@William 'result' n'est pas la structure arborescente finale, mais un moyen de faire une boucle sur les nœuds. Une fois cela fait, les 'Children' de chaque noeud seront définis, et avec' MyObject2 root = result [0]; 'vous aurez le noeud racine. –

Questions connexes