2010-08-11 6 views
2

Comment puis-je obtenir une liste de tous les nœuds dans un arbre en utilisant LINQ?Comment puis-je obtenir une liste de tous les nœuds dans un arbre en utilisant LINQ?

Mes cours sont:

class Node 
{ 
public class Node() 
{ 
    Children = new List<Node>(); 
} 

public List<Node> Children { get; set;} 
} 

class Tree 
{ 
public Tree() 
{ 
    Roots = new List<Node>(); 
} 

List<Node> Roots { get; set;} 
} 
+0

Est-ce que ce travail est fait? – leppie

+0

Non, ce n'est pas, J'ai un arbre d'objets et j'ai besoin de faire des requêtes à ce sujet, c'est tout – Homam

+0

s'il vous plaît être échantillon que possible – DEVMBM

Répondre

3
class Node 
    { 
    public Node() 
    { 
     Children = new List<Node>(); 
    } 

    public IEnumerable<Node> GetSubTree() 
    { 
     return Children.SelectMany(c => c.GetSubTree()).Concat(new[] { this }); 
     //Post-order traversal 
    } 

    public List<Node> Children { get; set; } 
} 

class Tree 
{ 
    public Tree() 
    { 
     Roots = new List<Node>(); 
    } 

    public IEnumerable<Node> GetAllNodes() 
    { 
     return Roots.SelectMany(root => root.GetSubTree()); 
    } 

    List<Node> Roots { get; set; } 
} 

Comment un arbre peut-il avoir plus d'une racine? N'est-ce pas une forêt?

+0

@Homan Func > nodesForTree = tree => tree.GetAllNodes(); Est-ce ce que vous voulez? Pourquoi? – Ani

+0

Merci pour votre réponse, je vais utiliser votre code, je voulais faire une requête sans changer le corps de la classe, en d'autres termes, créer la fonction GetSubTree avant la requête et l'utiliser dans la requête sans changer la classe. de toute façon, merci encore :) – Homam

+0

@ Homan: Je comprends. Si c'est ce que vous recherchez, vous pouvez facilement placer ces méthodes dans une classe distincte, car elles nécessitent uniquement l'accès aux propriétés publiques. Vous pouvez les marquer comme des méthodes d'extension pour simuler la syntaxe d'utilisation. – Ani

3
var allNodes = yourTree.Roots.SelectMany(x => x.TraverseTree(y => y.Children)); 

// ... 

public static class EnumerableExtensions 
{ 
    public static IEnumerable<T> TraverseTree<T>(
     this T parentNode, Func<T, IEnumerable<T>> childNodesSelector) 
    { 
     yield return parentNode; 

     IEnumerable<T> childNodes = childNodesSelector(parentNode); 
     if (childNodes != null) 
     { 
      foreach (T childNode in 
       childNodes.SelectMany(x => x.TraverseTree(childNodesSelector))) 
      { 
       yield return childNode; 
      } 
     } 
    } 
} 
Questions connexes