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

必要なのは、基本的なツリー トラバーサル関数 (preorder、inorder、postorder - これは問題ではありません) とフィルター関数です。次に、これら2つを一緒に構成して、必要なものを取得できます。

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 に答える