4

我需要编写一个树搜索方法,它接受一个类型参数 T 并返回树中存在的所有类型 T 的项目。有没有办法做到这一点?在这一点上,我更喜欢优雅而不是效率......

4

4 回答 4

2

好吧,在内部,该方法必须遍历树的所有元素,因此跳到仅枚举它,并且使用 OfType LINQ 方法并没有那么远:

var onlyTs = yourTree.OfType<SomeT>();
于 2009-04-09T07:48:11.867 回答
2

像这样的东西:

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;
        }
}

然后,您可以将其作为扩展方法针对根节点调用:

foreach( MyCustomNodeClass item in rootNode.AllDescendantNodes<MyCustomNodeClass>() ) 
{
    ...
}
于 2009-04-09T07:51:31.623 回答
1

假设你的树是通用的。即Item<T>

int count = yourTree.Count(p => p == typeof(T));

否则,解析每个节点并比较“ item == typeof(T)

于 2009-04-09T07:46:55.567 回答
1

您需要的是一个基本的树遍历函数(前序、中序或后序——这无关紧要)和一个过滤器函数。然后你可以将这两者组合在一起并得到你需要的东西:

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;
}
于 2009-04-09T07:49:38.883 回答