You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归为Group派生类分配ParentGroup属性?

递归设置Group派生类的ParentGroup属性方案

我来帮你搞定这个递归设置父节点的问题!先把你的类结构明确出来,方便后续说明:

public abstract class Group 
{ 
    public Group ParentGroup { get; set; } 
}

public class LeafA : Group { }

public class GroupB : Group 
{ 
    public List<Group> Groups { get; set; } 
}

你的需求是递归遍历所有Group实例,给每个节点正确分配ParentGroup属性——尤其是GroupB里面嵌套的子Groups,对吧?下面给你两种实用的实现方式:

方式一:手动递归扩展方法(适合一次性处理整个树)

这种方式适合你已经构建好整个Group树,需要一次性给所有节点设置父节点的场景。我们可以写一个扩展方法,递归遍历每个节点:

public static class GroupExtensions
{
    public static void SetParentRecursively(this Group childGroup, Group parentGroup)
    {
        // 给当前节点设置父节点
        childGroup.ParentGroup = parentGroup;
        
        // 如果当前节点是GroupB,遍历它的子Groups继续递归设置
        if (childGroup is GroupB groupB && groupB.Groups != null)
        {
            foreach (var subGroup in groupB.Groups)
            {
                subGroup.SetParentRecursively(childGroup);
            }
        }
    }
}

使用示例:

// 构建你的Group树
var root = new GroupB
{
    Groups = new List<Group>
    {
        new LeafA(),
        new GroupB
        {
            Groups = new List<Group> { new LeafA() }
        }
    }
};

// 根节点没有父节点,传入null触发递归设置
root.SetParentRecursively(null);

方式二:在GroupB内部自动处理(适合动态添加节点)

如果你需要动态给GroupB添加子节点,不想每次都手动调用递归方法,可以在GroupB的属性或添加方法里自动设置父节点,避免遗漏:

public class GroupB : Group 
{ 
    private List<Group> _groups;
    
    public List<Group> Groups 
    { 
        get => _groups;
        set
        {
            _groups = value;
            // 设置整个列表时,批量给子节点设置父节点
            if (_groups != null)
            {
                foreach (var subGroup in _groups)
                {
                    subGroup.ParentGroup = this;
                }
            }
        }
    }
    
    // 单独添加子节点的方法,确保添加时自动设置父节点
    public void AddGroup(Group group)
    {
        if (_groups == null)
        {
            _groups = new List<Group>();
        }
        group.ParentGroup = this;
        _groups.Add(group);
    }
}

使用示例:

var root = new GroupB();
// 添加子节点时自动设置父节点
root.AddGroup(new LeafA());

var nestedGroup = new GroupB();
root.AddGroup(nestedGroup);
nestedGroup.AddGroup(new LeafA());

// 所有节点的ParentGroup都已经自动设置好了,不需要额外调用递归方法

注意事项:

  • 两种方式都考虑了Groups列表为null的情况,避免空引用异常
  • 如果使用方式二,直接给Groups赋值时也要确保子节点的父节点被正确设置(代码里已经处理了这个情况)

内容的提问来源于stack exchange,提问作者JetsYanks08

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:28:29