如果TreeNode.Nodes.ContainsKey(string key)
在其子项中递归搜索该键,或者仅使用常规for循环搜索其子项,我对此感到困惑。
如果它以递归方式搜索密钥,是否有一种方法只能在其子代中进行搜索?
答案 0 :(得分:2)
根据Reference Source,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 :(得分: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);
}
答案 2 :(得分:1)
TreeNode.Nodes.ContainsKey(string key)
仅搜索子节点中key
,它是TreeNode
的直接后代,并且不会递归检查子节点。
Nodes
的{{1}}属性,类型为TreeNode
,也有Find(string key, bool searchAllChildren)
方法,可让您指定是否要递归搜索或者只搜索TreeNodeCollection
的直接后代。
示例:假设您有一个名为myTreeNode的TreeNode ...
TreeNode
因此,// 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
的所有后代的选项。