我有一个树视图,只想返回满足给定条件的最深节点。
到目前为止,这个问题的答案是最有希望的: Searching a tree using LINQ
所以我可以这样做:
foreach(CustomTreeNode aNode in treMyTreeView.Nodes){
List<TreeNode> EligibleNodes =
aNode.Descendants().Where(node => node.Tag == SomeCondition)
}
(我意识到我可能需要做更多的工作才能从TreeNode转换为CustomTreeNode)
但在我到达那里之前,我一直试图将扩展方法添加到TreeNode类中。
public class CustomTreeNode : TreeNode {
static IEnumerable<TreeNode> Descendants(this TreeNode root) {
var nodes = new Stack<TreeNode>(new[] { root });
while (nodes.Count > 0) {
TreeNode node = nodes.Pop();
yield return node;
foreach (TreeNode n in node.Nodes) nodes.Push(n);
}
}
}
您告诉我它需要是静态的,因此我无法从TreeNode派生。我不明白为什么。
我如何实现上述(或类似的东西)?
答案 0 :(得分:3)
将它放在一个静态助手类中,如:
public static class CustomTreeNodeExtensions
{
public static IEnumerable<TreeNode> Descendants(this TreeNode root)
{
// method
}
}
扩展需要在静态类中。
但是如果您创建了一个CustomTreeNode
类,无论如何,如果直接将它添加到类中,为什么要将它作为扩展方法呢?为什么不将它作为常规方法(如果你刚刚为扩展创建了CustomTreeNode
,这是无关紧要的 - 在这种情况下:包含扩展方法的类不需要从你试图创建的类继承的扩展方法?
public class CustomTreeNode : TreeNode
{
public IEnumerable<TreeNode> Descendants()
{
var nodes = new Stack<TreeNode>(new[] { this });
// rest
}
}
答案 1 :(得分:0)
您必须在单独的静态类中声明扩展方法。
public static class NodeExtensions
{
static IEnumerable<TreeNode> Descendants(this TreeNode root) {
var nodes = new Stack<TreeNode>(new[] { root });
while (nodes.Count > 0) {
TreeNode node = nodes.Pop();
yield return node;
foreach (TreeNode n in node.Nodes) nodes.Push(n);
}
}
}