【问题标题】:How to change this function to the recursive function如何将此函数更改为递归函数
【发布时间】:2016-02-09 07:59:56
【问题描述】:

我有以下代码比较node.Texto 每个给定的节点集,如果它们相等则返回一,否则返回零。但我的问题是它只是比较第一个孩子,因为nodes2.Nodes[ii] 因此我知道它不会继续前进。

据我所知,如果它是 TreeNodeCollection,使用 foreach 循环对每个节点和子节点进行递归是很容易的。

但是在这里我如何将代码更改为递归版本? 提前致谢!

public int Compare_ChildNodes(TreeNode nodes1, TreeNode nodes2)
{
    int length_children1 = nodes1.Nodes.Count;
    int length_children2 = nodes2.Nodes.Count;
    int result_int = 1;
    if (length_children1 != length_children2)
    {
        result_int = 0;
    }
    else
    {
        for (int ii = 0; ii < length_children1; ii++)
        {
            if (nodes1.Nodes[ii].Text.Equals(nodes2.Nodes[ii].Text))
            {
                int ret = Compare_ChildNodes(nodes1.Nodes[ii], nodes2.Nodes[ii]);
                result_int = ret;
            }
            else
            {
                result_int = 0;
            }
        }
    }

    return result_int;
}

【问题讨论】:

    标签: c# .net winforms treeview treenode


    【解决方案1】:

    我在这里看不到任何问题。用nodes1.Nodes[ii]nodes2.Nodes[ii] 调用Compare_ChildNodes 正是你想要的递归。

    我只是建议对您的代码进行一些优化(“提早”):

    public int Compare_ChildNodes(TreeNode nodes1, TreeNode nodes2)
    {
        int length_children1 = nodes1.Nodes.Count;
        int length_children2 = nodes2.Nodes.Count;
        int result_int = 1;
    
        if (!nodes1.Text.Equals(nodes2.Text)) return 0; // not equal
        if (length_children1 != length_children2) return 0; // not equal
    
        return nodes1.Nodes.OfType<TreeNode>.Select((node, idx) => 
             Compare_ChildNodes(node, nodes2.Nodes[idx]).Any(result => result == 0) ? 0 : 1;
    }
    

    我将节点文本的比较更改为另一个递归级别,以便您可以使用 linq 进行递归。

    linq Any 方法检查是否有任何比较(在 Select 方法中)返回 0,指示子节点集合不相等。

    Selectnode1.Nodes 中的每个 TreeNode 调用,并在该集合中使用它的索引。所以你可以使用这个索引从node2.Nodes获取匹配的节点,并为这两个调用Compare_ChildNodes

    一旦发现不相等的(子)节点,就可以返回0,无需继续比较其他节点。

    如果您不能使用 linq 语句(出于框架原因或其他原因),您仍然可以使用 for 循环:

    for (int idx = 0; idx < length_children1; idx++)
        if (Compare_ChildNodes(nodes1.Nodes[idx], nodes2.Nodes[idx]) == 0)
            return 0;
    return 1;
    

    【讨论】:

    • 谢谢!但我有这个错误:Error 1 'System.Linq.ParallelEnumerable.OfType&lt;TResult&gt;(System.Linq.ParallelQuery)' is a 'method', which is not valid in the given context
    • @SaberJalilzadeh 这实际上应该是System.Linq.Enumerable.OfType&lt;TResult&gt;。你能检查一下你的using 声明吗?
    • @SaberJalilzadeh 在我的回答中添加了非 linq 版本。
    • 我有这些 using 声明:using System.Linq;using System.Xml.Linq;
    • @SaberJalilzadeh 这是一个有趣的问题...我不知道您的编译器为什么不选择Enumerable.OfType...在这里可以正常工作。你的TreeNodes 是System.Windows.Forms.TreeNode?
    猜你喜欢
    • 2020-09-03
    • 1970-01-01
    • 2021-10-10
    • 2021-11-03
    • 2020-08-20
    • 1970-01-01
    • 2019-03-01
    相关资源
    最近更新 更多