如何改造代码实现递归获取并处理层级嵌套的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
相关产品推荐
相关产品推荐

