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

如何改造代码实现递归获取并处理层级嵌套的Items属性?

问题

现有代码可获取groupItem,但每个groupItem及下属item都包含Items属性,存在层级嵌套结构。请改造以下代码,实现递归逻辑以处理所有层级的Items:

foreach (var groupItem in controlInfoDataGroup.Groups)
{
    var infoBadgeGroup = GetInfoBadge(groupItem.InfoBadge);

    ControlInfoDataGroup group = new ControlInfoDataGroup(groupItem.Title,...);

    foreach (var itemInfo in group.Items)
    {
        bool isNew = itemInfo.IsNew;
        bool isUpdated = itemInfo.IsUpdated;
        bool isPreview = itemInfo.IsPreview;
        ...
        var item = new ControlInfoDataItem(itemInfo.UniqueId,
                                        ...);

        item.IncludedInBuild = isIncludedInBuild;

        foreach (var doc in itemInfo.Docs)
        {
            item.Docs.Add(new ControlInfoDocLink(doc.Title, doc.Uri));
        }
        foreach (var relatedControl in itemInfo.RelatedControls)
        {
            item.RelatedControls.Add(relatedControl);
        }
        group.Items.Add(item);
    }
    Groups.Add(group);
}
解决方案

要处理嵌套层级的Items,核心是把单个Item的创建+嵌套Items递归处理抽成独立方法,通过方法自调用实现层级遍历,以下是具体改造步骤:

步骤1:提取Item递归处理方法

定义一个递归方法,负责创建ControlInfoDataItem实例,同时自动处理当前Item下属的嵌套Items:

private ControlInfoDataItem CreateControlInfoDataItem(YourItemSourceType itemInfo) // 替换为实际的数据源Item类型
{
    // 创建当前层级的Item并赋值基础属性
    bool isNew = itemInfo.IsNew;
    bool isUpdated = itemInfo.IsUpdated;
    bool isPreview = itemInfo.IsPreview;
    // ... 保留原代码中所有属性赋值逻辑
    var item = new ControlInfoDataItem(itemInfo.UniqueId, ...);
    item.IncludedInBuild = isIncludedInBuild;

    // 处理文档链接
    foreach (var doc in itemInfo.Docs)
    {
        item.Docs.Add(new ControlInfoDocLink(doc.Title, doc.Uri));
    }
    // 处理关联控件
    foreach (var relatedControl in itemInfo.RelatedControls)
    {
        item.RelatedControls.Add(relatedControl);
    }

    // 递归处理当前Item下属的嵌套Items
    foreach (var nestedItemInfo in itemInfo.Items)
    {
        var nestedItem = CreateControlInfoDataItem(nestedItemInfo);
        item.Items.Add(nestedItem);
    }

    return item;
}

步骤2:改造原代码调用递归方法

根据业务场景分两种情况处理:

场景1:仅Item存在嵌套层级

如果Group本身没有嵌套结构,仅Item有下属Items,原代码改造后如下:

foreach (var groupItem in controlInfoDataGroup.Groups)
{
    var infoBadgeGroup = GetInfoBadge(groupItem.InfoBadge);
    ControlInfoDataGroup group = new ControlInfoDataGroup(groupItem.Title, ...);

    // 遍历数据源的Items,调用递归方法处理所有嵌套层级
    foreach (var itemInfo in groupItem.Items) // 注意:原代码中group.Items应为笔误,实际需遍历数据源的groupItem.Items
    {
        var item = CreateControlInfoDataItem(itemInfo);
        group.Items.Add(item);
    }

    Groups.Add(group);
}

场景2:Group也存在嵌套层级

如果Group本身也有下属Groups属性,需要给Group也添加递归处理方法:

private ControlInfoDataGroup CreateControlInfoDataGroup(YourGroupSourceType groupItem) // 替换为实际的数据源Group类型
{
    var infoBadgeGroup = GetInfoBadge(groupItem.InfoBadge);
    ControlInfoDataGroup group = new ControlInfoDataGroup(groupItem.Title, ...);

    // 处理当前Group下的Items
    foreach (var itemInfo in groupItem.Items)
    {
        var item = CreateControlInfoDataItem(itemInfo);
        group.Items.Add(item);
    }

    // 递归处理当前Group下的嵌套Groups
    foreach (var nestedGroupItem in groupItem.Groups)
    {
        var nestedGroup = CreateControlInfoDataGroup(nestedGroupItem);
        group.Groups.Add(nestedGroup);
    }

    return group;
}

此时原代码可简化为:

foreach (var groupItem in controlInfoDataGroup.Groups)
{
    var group = CreateControlInfoDataGroup(groupItem);
    Groups.Add(group);
}

关键注意事项

  • 递归的核心是方法自调用,会自动遍历所有层级的嵌套内容,直到没有下属Items/Groups为止。
  • 需将代码中的YourItemSourceType、YourGroupSourceType替换为实际的数据源类型名称。
  • 原代码中foreach (var itemInfo in group.Items)大概率是笔误,需改为遍历数据源的groupItem.Items,否则会遍历空集合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:42:22