C# 递归查找树视图节点

C# 递归查找树视图节点,c#,C#,我有下面的树 A +-B +-C | +-D +-E +-F +-G 我试图找到给定的AG private TreeListNode FindTreeNode(TreeListNode node, Enumerations.ItemType type, Nullable<long> id) { TreeListNode found = null; foreach (TreeListNode

我有下面的树

A
+-B
+-C 
| +-D
+-E
  +-F
  +-G
我试图找到给定的
A
G

private TreeListNode FindTreeNode(TreeListNode node, Enumerations.ItemType type,
                                  Nullable<long> id)
{
    TreeListNode found = null;
    foreach (TreeListNode child in node.Nodes)
    {
        if ((Enumerations.ItemType)child[2] == type)
        {
            if (id == null)
            {
                found = child;
                break;
            }
            else
            {
                if ((long)child[0] == (long)id)
                {
                    found = child;
                    break;
                }
            }
        }
        else
        {
            if (child.HasChildren)
            {
                found = FindTreeNode(child, type, id);
                break;
            }
        }
    }
    return found;
}
由于
C
位于
G
之前,因此例程用于查找
C
及其子项。 如果else块
if(child.haschilds)
它会找到
C及其子项。
当我试图找到
E
及其子对象时, 递归调用无法正常工作。 它与根节点
A
一起进入,但在它进入递归之后,子节点变成
C
,然后变成
nodes.nodes=1


当我搜索
F
G
时,它必须继续递归。那么,如何将子节点设置为根节点呢?如果递归调用没有找到任何内容,那么就可以实现盈亏平衡。将相关代码更改为:

if (child.HasChildren)
{
    found = FindTreeNode(child, type, id);
    if (found != null) 
        break;
}

你的方法看起来很复杂。这不是也一样吗

private TreeListNode FindTreeNode(TreeListNode node, Enumerations.ItemType type,
                                  Nullable<long> id)
{
    foreach (TreeListNode child in node.Nodes) {
        if ((Enumerations.ItemType)child[2] == type &&
            (id == null || (long)child[0] == id.Value)) {

            return child;
        }

        if (child.HasChildren) {
            TreeListNode found = FindTreeNode(child, type, id);
            if (found != null) {
                return found;
            }
        }
    }
    return null;
}
私有TreeListNode FindTreeNode(TreeListNode节点,Enumerations.ItemType,
可为空的id)
{
foreach(node.Nodes中的TreeListNode子节点){
if((Enumerations.ItemType)子项[2]==类型&&
(id==null | |(长)子项[0]==id.Value)){
返回儿童;
}
if(child.HasChildren){
找到TreeListNode=FindTreeNode(子级、类型、id);
如果(找到!=null){
发现退货;
}
}
}
返回null;
}

您的
TreeListNode
看起来像什么?为什么要将
C
作为第二个参数传递给
FindTreeNode
?从签名来看,它应该是一个
Enumerations.ItemType
private TreeListNode FindTreeNode(TreeListNode node, Enumerations.ItemType type,
                                  Nullable<long> id)
{
    foreach (TreeListNode child in node.Nodes) {
        if ((Enumerations.ItemType)child[2] == type &&
            (id == null || (long)child[0] == id.Value)) {

            return child;
        }

        if (child.HasChildren) {
            TreeListNode found = FindTreeNode(child, type, id);
            if (found != null) {
                return found;
            }
        }
    }
    return null;
}