型パラメーター T を取り、ツリーに存在する型 T のすべての項目を返すツリー検索メソッドを作成する必要があります。これを行う方法はありますか?この時点では、効率よりもエレガンスを好むでしょう...
1283 次
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 に答える