2011-07-02 7 views
2

J'ai lu et recherché et je n'ai pas encore trouvé de réponse à ce problème relativement simple.Recherche récursive de listes imbriquées

J'ai une classe:

public class AccessibleTreeItem 
{ 
    public string name; 
    public List<AccessibleTreeItem> children; 

    public AccessibleTreeItem() 
    { 
     children = new List<AccessibleTreeItem>(); 
    } 
} 

qui est remplir à l'aide d'une série de fonctions qui ne vraiment pas d'importance dans ce contexte, mais ce que je suis à la recherche est un moyen de rechercher à travers toutes les éléments enfants dans la liste, en recherchant une valeur "nom" particulière, et si elle est trouvée, retourne cette liste.

Comment cela est-il réalisé de la manière la plus simple, avec un minimum de performance? Merci - J'ai été perplexe à ce point pendant des jours maintenant ...

+0

Voulez-vous une liste ou un article retourné? –

+0

Ce serait un objet. Il ne devrait y avoir qu'un résultat renvoyé ... et maintenant que j'y pense, peut-être que ce devrait être une liste. Je peux toujours vérifier combien d'objets y sont. – HeWhoWas

+0

Mais une liste de recherche de tous les articles est beaucoup plus chère que de trouver seulement la première. –

Répondre

12
public class AccessibleTreeItem 
{ 
    public string name; 
    public List<AccessibleTreeItem> children; 

    public AccessibleTreeItem() 
    { 
     children = new List<AccessibleTreeItem>(); 
    } 

    public static AccessibleTreeItem Find(AccessibleTreeItem node, string name) 
    { 

     if (node == null) 
      return null; 

     if (node.name == name) 
      return node; 

     foreach (var child in node.children) 
     { 
      var found = Find(child, name); 
      if (found != null) 
       return found; 
     } 

     return null; 
    } 
} 
+0

Bien, mais il s'agit d'une recherche en profondeur. Il serait peut-être plus efficace de vérifier tous les enfants avant de les récurer. –

+0

Donc, vous dites DFS est moins efficace, que BFS ... Hm, non - ils sont exactement les mêmes - les deux traversent en visitant chaque nœud qu'une seule fois. Si vous ne voulez pas avoir de récursivité, vous pouvez faire itérativement BFS et DFS. –

+0

J'ai testé le code, et pour une raison quelconque, il renvoie toujours null? J'ai défini des points d'arrêt et vérifié le noeud AccessibleTreeItem manuellement - l'objet enfant est présent, mais il est imbriqué dans 4 niveaux. Le fait qu'il y ait un nombre illimité d'imbrications change-t-il la façon dont cela devrait fonctionner? – HeWhoWas