TreeNode.Nodes.ContainsKey的算法是什么

时间:2017-06-25 03:08:12

标签: c# treenode

如果TreeNode.Nodes.ContainsKey(string key)在其子项中递归搜索该键,或者仅使用常规for循环搜索其子项,我对此感到困惑。
如果它以递归方式搜索密钥,是否有一种方法只能在其子代中进行搜索?

3 个答案:

答案 0 :(得分:2)

根据Reference SourceContainsKey执行以下操作:

    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的所有后代的选项。