/ / Trouver un objet dans un arbre - c #, winforms, treeview

Rechercher un objet dans un arbre - C #, Winforms, Treeview

j'ai un Treeview dans mon contrôle que j'utilise le Tag propriété de conserver une copie de l'objet qu'il représente. Ainsi, lorsque je clique sur un élément de l’arbre, je peux facilement obtenir l’objet auquel il fait référence.

J'ajoute maintenant un noeud à ceci et je veux rechercher rapidement les noeuds via une propriété dans l'objet stocké.

Donc, quelque chose de similaire à ceci:

class MyObject
{
int Index;
}

IEnumerable<TreeNode> nodes = this.myTree.Nodes[0].Nodes.Cast<TreeNode>();
TreeNode currentNode = (from node in nodes
let ts = node.Tag as MyObject
where ts.Index == eqId.Index
select node).First();

Cela fonctionne mais je ne sais pas si je le faiscorrectement ou s’il existe une solution plus simple. Cela recherche tous les nœuds d'un niveau particulier si j'ai bien compris, mais puis-je le faire arrêter une fois que le premier est trouvé plutôt que de chercher dans tout l'arbre?

Existe-t-il un moyen plus simple de rechercher dans le Tags ou est-ce que mon approche est tout simplement fausse pour commencer?

Réponses:

1 pour la réponse № 1

En gros, ça va. A propos des détails:

Si vous souhaitez que l'énumération soit arrêtée dès qu'une correspondance est trouvée, vous devez écrire votre propre énumérateur pour la vue arborescente:

public static IEnumerable<TreeNode> Descendants(this TreeNodeCollection c)
{
foreach (var node in c.OfType<TreeNode>())
{
yield return node;

foreach (var child in node.Nodes.Descendants())
{
yield return child;
}
}
}

et avoir

IEnumerable<TreeNode> nodes = this.myTree.Nodes.Desscendants();

J'ai remarqué que votre code ne cherche que le niveau racine. Le code que j'ai fourni recherche tous les nœuds, y compris les descendants. Si vous ne le souhaitez pas, supprimez la boucle foreach imbriquée.

Assurez-vous également que vous utilisez .FirstOrDefault au lieu de .First. Ensuite, vous aurez une valeur null au lieu d'une exception s'il n'y a pas de correspondance.

La manière la plus simple IMHO est:

TreeNode currentNode = nodes.FirstOrDefault(n => (n.Tag as MyObject).Index == eqId.Index);