私はTreeNode.Nodes.ContainsKey(string key)
については混乱しています。子ノードでキーを再帰的に検索したり、通常のforループのみを使用して子ノードを検索すると混乱します。
再帰的にキーを検索する場合、その子のみを検索する方法はありますか? Reference SourceによるとTreeNode.Nodes.ContainsKeyのアルゴリズムは何ですか
2
A
答えて
2
、ContainsKey
は次の処理を行います。
public virtual bool ContainsKey(string key) {
return IsValidIndex(IndexOfKey(key));
}
そして、その方法はありません:
public virtual int IndexOfKey(String key) {
// Step 0 - Arg validation
if (string.IsNullOrEmpty(key)){
return -1; // we dont support empty or null keys.
}
// step 1 - check the last cached item
if (IsValidIndex(lastAccessedIndex))
{
if (WindowsFormsUtils.SafeCompareStrings(this[lastAccessedIndex].Name, key, /* ignoreCase = */ true)) {
return lastAccessedIndex;
}
}
// step 2 - search for the item
for (int i = 0; i < this.Count; i ++) {
if (WindowsFormsUtils.SafeCompareStrings(this[i].Name, key, /* ignoreCase = */ true)) {
lastAccessedIndex = i;
return i;
}
}
// step 3 - we didn't find it. Invalidate the last accessed index and return -1.
lastAccessedIndex = -1;
return -1;
}
private bool IsValidIndex(int index) {
return ((index >= 0) && (index < this.Count));
}
だから、それだけでキーのインデックスを見つけようと表示され、それはだ場合有効であれば、キーが存在しなければならないことを意味します。
1
コードは、キーで最初のノードを取得するのが簡単です。コードがトップレベルのノードをチェックしないように、root = trueを使用します。コードは、ツリービューのルートだけでなく、どんなものでも使用できます。
public KeyValuePair<Boolean, TreeNode> SearchChildren(TreeNode node, string key, Boolean root)
{
if (!root)
{
if(node.Nodes.ContainsKey(key)) return new KeyValuePair<bool, TreeNode>(true, node.Nodes[key]);
}
foreach (TreeNode child in node.Nodes)
{
if (child.Nodes != null)
{
KeyValuePair<Boolean, TreeNode> results = SearchChildren(child, key, false);
if (results.Key)
{
return results;
}
}
}
return new KeyValuePair<bool, TreeNode>(false, null);
}
1
TreeNode.Nodes.ContainsKey(string key)
はTreeNode
の直接の子孫である子ノードでkey
を検索し、再帰的に子ノードをチェックしません。タイプTreeNodeCollection
であるTreeNode
の
Nodes
プロパティは、また、あなたが再帰的に検索またはちょうどTreeNode
の直接の子孫を検索するかどうかを指定することができますFind(string key, bool searchAllChildren)
方法があります。
例:
// search for the key only in direct descendents of myTreeNode
bool keyIsPresent = myTreeNode.Nodes.ContainsKey("someKey");
// value of keyIsPresent will be the same if you specify false
// for the searchAllChildren parameter in Find
bool keyIsPresent = myTreeNode.Nodes.Find("someKey", false).Length > 0;
// value of KeyIsPresent will not necessarily be the same if you
// specify true for the searchAllChildren parameter in Find, which is
// recursive and will search all descendents of myTreeNode
bool keyIsPresent = myTreeNode.Nodes.Find("someKey", true).Length > 0;
だから
Find
方法が唯一の直接の子孫、または
TreeNode
のすべての子孫を検索するオプションを提供します...あなたはmyTreeNodeと呼ばれるツリーノードがあるとします。
関連する問題
- 1. pythonで 'set.intersection()'のアルゴリズムは何ですか?
- 2. クラッシュロイヤルのカードショーのアルゴリズムは何ですか?
- 3. `tbb :: parallel_sort`のアルゴリズムは何ですか
- 4. TreeSortとHeapSortのアルゴリズムは何ですか?
- 5. このアルゴリズムとは何ですか?
- 6. R * -Treeアルゴリズムとは何ですか?
- 7. Mac OSX Exposeアルゴリズムとは何ですか?
- 8. このケースで使用する回帰アルゴリズムは何ですか?
- 9. Pythonで同等のC/C++のloseloseアルゴリズムとは何ですか?
- 10. いくつかの機械学習アルゴリズムは何ですか
- 11. Cでのアルゴリズム比較、違いは何ですか?
- 12. OpenCVのSGBMアルゴリズムで "cliptab"とは何ですか?
- 13. ダイクストラのアルゴリズムでINT_MAXとは何ですか?
- 14. このアルゴリズムの時間の複雑さは何ですか
- 15. 関連するコンテンツクエリの基本的なアルゴリズムは何ですか?
- 16. ランポートの事前発生アルゴリズムの欠点は何ですか?
- 17. この週番号アルゴリズムの名前は何ですか?
- 18. opensshのデフォルトのkexアルゴリズムは何ですか?
- 19. このアルゴリズムのbig-O表記法とは何ですか?
- 20. このアルゴリズムの複雑さは何ですか
- 21. Rapidminerの深い学習アルゴリズムの種類は何ですか?
- 22. 飽和と明るさのCSSフィルタのアルゴリズムは何ですか?
- 23. このアルゴリズムのBig O表記は何ですか
- 24. 現在の最先端のサフィックスアレイ構築アルゴリズムは何ですか?
- 25. Math.pow()の背後にあるJavaのアルゴリズムは何ですか
- 26. xorshift128 +アルゴリズムの実際の定義は何ですか?
- 27. このアルゴリズムの効率は何ですか
- 28. linuxのfactorコマンドの背後にあるアルゴリズムは何ですか?
- 29. このアルゴリズムの欠陥は何ですか?
- 30. ブースのアルゴリズムの本質は何ですか?
ありがとう、それはとても役に立ちます:) –