Méthode d’extension : Recherche récursive dans un Treeview

Voici une petite méthode d’extension qui permet d’effectuer une recherche de manière récursive dans un treeview en lui spécifiant un prédicat :

            public static class TreeNodeExtension
            {
            public static IEnumerable<TreeNode> FindNodes(this TreeNodeCollection nodesCollection, Func<TreeNode, bool> predicate)
            {
            var nodes = nodesCollection.Cast<TreeNode>();
            return nodes.SelectMany(n => FindNodes(n.Nodes, predicate).Union(nodes.Where(n2 => predicate(n2))));
            }
            }

Le SelectMany permet de mettre à plat l’appel récursif. Si on utilise un Select à la place du SelectMany on obtient une liste de liste de nœud. Le SelectMany est l’équivalent de 2 from comme ceci :

            return 	from n in nodes
            from child in n.Nodes
            where predicate(child)
            select child;

Pour l’utiliser ce n’est pas bien compliqué…

Je voudrai récupérer la liste des TreeNode de type FileNode et qui sont sélectionnés :

var checkedFilesNode = treeView1.Nodes.FindNodes(n => n is FileNode && n.Checked == true);

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s