如何将此函数更改为递归函数

时间:2016-02-09 07:59:56

标签: c# .net winforms treeview treenode

我有以下代码比较每个给定节点集的node.Text o,如果它们相等则返回一个,否则为零。但我的问题是它只是因为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;
}

1 个答案:

答案 0 :(得分:1)

我在这里看不到任何问题。使用Compare_ChildNodesnodes1.Nodes[ii]调用nodes2.Nodes[ii]可以完全执行您想要的递归。

我只是为您的代码建议一点优化(&#34;早期&#34;):

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,表明子节点集合不相等。

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

一旦找到不相等(子节点)节点,您就可以返回0并且不需要继续比较其他节点。

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

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