Je dois écrire une méthode de recherche arborescente qui prend un paramètre de type T et renvoie tous les éléments de type T qui existent dans l'arborescence. Est-ce qu'il y a un moyen de faire ça? Je préférerais l'élégance à l'efficacité à ce stade ...Recherche de tous les objets de type T dans une arborescence C#
Répondre
Quelque chose comme ceci:
internal static IEnumerable<T> AllDescendantNodes<T>(this TreeNode input)
where T class;
{
T current = null;
foreach (TreeNode node in input.Nodes)
if((current = node as T) != null)
{
yield return current;
foreach (var subnode in node.AllDescendantNodes<T>())
yield return subnode;
}
}
Vous pouvez ensuite appeler cela contre le nœud racine comme une méthode d'extension:
foreach(MyCustomNodeClass item in rootNode.AllDescendantNodes<MyCustomNodeClass>())
{
...
}
En supposant que votre arbre est générique. c'est-à-dire Item<T>
.
int count = yourTree.Count(p => p == typeof(T));
Sinon, analyser chaque noeud et comparer « item == typeof(T)
»
Eh bien, en interne la méthode aurait pour itérer sur tous les éléments de l'arbre, de sorte que le saut juste énumérer dessus, et en utilisant le OfType méthode LINQ est pas loin:
var onlyTs = yourTree.OfType<SomeT>();
+1 pour avoir donné la bonne réponse :) Je viens de réaliser que j'ai raté le point –
Qu'est-ce que vous avez besoin est une fonction traversal arbre de base (pré-commande, afinde ou postorder - ce n'a pas d'importance) et une fonction de filtre. Ensuite, vous pouvez composer ces deux ensemble et obtenir ce dont vous avez besoin:
IEnumerable<T> Traverse(Tree<T> tree)
{
yield return tree.Data;
foreach(Tree<T> subtree in tree.Subtrees)
foreach(T t in Traverse(subtree))
yield return t;
}
IEnumerable<U> Filter<T, U>(IEnumerable<T> source)
where U : T
{
foreach(T t in source)
if(t is U)
yield return (U)t;
}
Idée similaire à la mienne, mais je ferais un changement: vous faites la conversion deux fois - 't comme U' et la vérification de null est plus rapide classes que si (t est U) (U) t'; – Keith
- 1. Contrôle de DataGridView C# avec une arborescence dans VS2008
- 2. Comment parcourir tous les nœuds d'une arborescence YAML dans Ruby?
- 3. Script tous les objets dans une base de données dans une table
- 4. Sélection de tous les objets enfants dans LINQ
- 5. Déplacer tous les objets de mon tableau?
- 6. Implémenter la recherche binaire dans les objets
- 7. Créer une arborescence dans WPF
- 8. Traverser une arborescence de répertoires
- 9. WPF - Filtrage/Recherche de vues de collections multiples dans une arborescence
- 10. Vérification de type sur les objets Caché
- 11. requête MySQL pour tous les termes de recherche dans l'index
- 12. Exécuter tous les tests dans une arborescence source, pas un package
- 13. C# recherche dans les listes
- 14. C#: paramètres de type multiple dans les extensions
- 15. Trouver tous les objets de base de données par nom?
- 16. Arborescence de fichiers associée dans Eclipse
- 17. Identity Insert manquant dans tous les objets de transformation de flux de données SSIS pertinents?
- 18. Récupérer tous les objets d'un contrôleur NSTree
- 19. Activerecord - callback après enregistrement de tous les objets associés
- 20. Ayant une arborescence riche
- 21. Recherche du type d'un objet inconnu en C++
- 22. Obtenir tous les types dérivés d'un type
- 23. recherche d'éléments de formulaire dans HttpWebResponse-C#
- 24. Recherche du type de Outlook.MAPIFolder
- 25. Existe-t-il une méthode de type zip dans .Net?
- 26. Type de tableau à plusieurs objets?
- 27. Modèle d'objet arborescence .NET
- 28. Comment afficher tous les objets d'une base de données particulière dans SQL Server 2005
- 29. Conversion d'un tableau de type T en un tableau de type I où T implémente I dans C#
- 30. Y a-t-il un moyen de passer un type de structure à une fonction c
Cela fonctionne pour moi. Je n'ai pas encore compris les méthodes d'extension, donc je ne sais pas si c'est performant. Mais c'est une solution élégante. De ce que je vois, seuls les descendants d'une entrée donnée sont vérifiés. J'ai dû modifier AllDescendants pour vérifier le type de noeud d'entrée et le céder. Merci –
En fait, je devais créer un nœud racine spécial, puis passer cela. Modifier AllDescendants était faux. Merci –
Les méthodes d'extension sont converties au moment de la compilation en appels statiques normaux - il n'y a aucune implication de performance pour les utiliser. Cette méthode gère la récursivité, donc j'en aurais potentiellement une similaire qui a fonctionné sur les nœuds de la racine de l'arbre, puis appelée cela. – Keith