如何将此函数更改为递归函数
How to change this function to the recursive function
我有以下代码比较给定节点集的 node.Text
o 和 return 一个,如果它们相等则为零。但我的问题是它只是比较第一个 children 因为 nodes2.Nodes[ii]
因此我知道它不会继续前进。
据我所知,如果它是 TreeNodeCollection
,则很容易对每个节点进行递归,并且 sub-node 使用 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;
}
我在这里看不到任何问题。使用 nodes1.Nodes[ii]
和 nodes2.Nodes[ii]
调用 Compare_ChildNodes
完全可以实现您想要的递归。
我只是建议对您的代码进行一些优化 ("early out"):
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
方法中) returns 0
表明子节点集合不相等。
Select
为 node1.Nodes
中的每个 TreeNode
及其在该集合中的索引调用。因此,您可以使用此索引从 node2.Nodes
中获取匹配的节点,并为这两个调用 Compare_ChildNodes
。
只要发现不相等的(子)节点,就可以return 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;
我有以下代码比较给定节点集的 node.Text
o 和 return 一个,如果它们相等则为零。但我的问题是它只是比较第一个 children 因为 nodes2.Nodes[ii]
因此我知道它不会继续前进。
据我所知,如果它是 TreeNodeCollection
,则很容易对每个节点进行递归,并且 sub-node 使用 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;
}
我在这里看不到任何问题。使用 nodes1.Nodes[ii]
和 nodes2.Nodes[ii]
调用 Compare_ChildNodes
完全可以实现您想要的递归。
我只是建议对您的代码进行一些优化 ("early out"):
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
方法中) returns 0
表明子节点集合不相等。
Select
为 node1.Nodes
中的每个 TreeNode
及其在该集合中的索引调用。因此,您可以使用此索引从 node2.Nodes
中获取匹配的节点,并为这两个调用 Compare_ChildNodes
。
只要发现不相等的(子)节点,就可以return 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;