型パラメータTをとり、ツリー内に存在するT型のすべての項目を返すツリー検索メソッドを記述する必要があります。これを行う方法はありますか?私はこの時点で効率以上の優雅さを好むでしょう...ツリー構造内のT型のすべてのオブジェクトの検索C#
答えて
このような何か:
foreach(MyCustomNodeClass item in rootNode.AllDescendantNodes<MyCustomNodeClass>())
{
...
}
:
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;
}
}
あなたはその後、拡張メソッドとしてルートノードに対してこれを呼ぶだろう
あなたの木は一般的だと仮定します。すなわちItem<T>
です。
int count = yourTree.Count(p => p == typeof(T));
そうでない場合は、各ノードを解析し、「item == typeof(T)
」
まあ、内部的方法は、ツリーのすべての要素を反復しなければならないので、スキップがちょうどその上に列挙し、使用することを比較OfType LINQメソッドはそこまでではありません。
var onlyTs = yourTree.OfType<SomeT>();
正しい答えを与えるために+1 :)ちょうど私がポイントを見逃したことを理解しました –
あなたが必要なものの基本的なツリートラバーサル機能である(先行順、順序どおりまたは後順 - これは重要ではありません)とフィルタ機能。その後、一緒にそれらの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;
}
私と同様のアイデアですが、私は1つの変更を行います:あなたは2回の変換を行っています - 't as U'を、クラスより'if(tはU)(U)t'; – Keith
- 1. get succesorバイナリ検索ツリーC++データ構造
- 2. C++構造体オブジェクト型エラーへのポインタ
- 3. のC#:検索と構造体
- 4. ディレクトリ構造内のファイルを検索
- 5. BK - ツリー検索すべて
- 6. C.のバイナリ検索ツリー
- 7. Cのバイナリ検索ツリー、セグメンテーションフォールトエラー
- 8. Cセグメンテーションフォールトのバイナリ検索ツリー
- 9. C構造体内の構造体内部の構造体
- 10. 検索フォームのURL構造
- 11. データ構造の検索レコード
- 12. IntelliJの構造検索は
- 13. エラーメッセージの検索構造
- 14. 構造(検索)
- 15. C++の構造体内の構造体
- 16. C++で構造体を検索する
- 17. Javaのジェネリックバイナリ検索ツリー型問題
- 18. ASTのツリー構造
- 19. ツリーのデータ構造
- 20. ツリー構造のビューファイル
- 21. 構造内のDyanmicデータ型
- 22. Cバイナリ検索ツリー
- 23. バイナリ検索ツリーC++
- 24. C++テンプレートバイナリ検索ツリー
- 25. バイナリ検索ツリー - 検索関数returnオブジェクト(C++)
- 26. MIPSバイナリ検索ツリー構造を作成する
- 27. Cのバイナリ検索ツリーの葉の数
- 28. バイナリ検索ツリー構築の問題
- 29. 型検査構造
- 30. (同じ構造の)複数のテーブル内のidの検索
それは私のために働く。私はまだ拡張メソッドの理解がないので、それが実行可能かどうかについては不明です。しかしそれは優雅な解決策です。私が見るものからは、与えられた入力の子孫のみがチェックされています。私は、入力ノードタイプをチェックしてそれを得るためにAllDescendantsを修正しなければなりませんでした。ありがとう –
実際に、私は特別なルートノードを作成し、それを渡す必要がありました。AllDescendantsを変更するのは間違っていました。ありがとう –
拡張メソッドは、コンパイル時に通常の静的呼び出しに変換されます。このメソッドは再帰を処理するので、私は潜在的にツリーのルートノードで動作し、これを呼び出す同様のものを持つでしょう。 – Keith