如何在C#中按pname和categoryName合并嵌套列表中的相同项
使用LINQ合并嵌套列表中的重复项
一、C#实体类定义
public class Category { public string categoryName { get; set; } // 可添加其他属性 } public class ExpItem { public string expName { get; set; } // 可添加其他属性 } public class ParentItem { public string pname { get; set; } public List<Category> catlist { get; set; } public List<ExpItem> explist { get; set; } }
二、原始数据与预期结果示例
原始列表JSON
[ { "pname": "产品A", "catlist": [{"categoryName": "分类1"}], "explist": [{"expName": "实验1"}, {"expName": "实验2"}] }, { "pname": "产品A", "catlist": [{"categoryName": "分类1"}], "explist": [{"expName": "实验3"}] }, { "pname": "产品B", "catlist": [{"categoryName": "分类2"}], "explist": [{"expName": "实验4"}] } ]
预期结果JSON
[ { "pname": "产品A", "catlist": [{"categoryName": "分类1"}], "explist": [{"expName": "实验1"}, {"expName": "实验2"}, {"expName": "实验3"}] }, { "pname": "产品B", "catlist": [{"categoryName": "分类2"}], "explist": [{"expName": "实验4"}] } ]
三、LINQ实现代码
var mergedList = originalList // 按pname和分类名分组(假设每个项的catlist仅含一个分类) .GroupBy(item => new { item.pname, CategoryName = item.catlist.First().categoryName }) .Select(group => new ParentItem { pname = group.Key.pname, // 复用分组内第一个项的catlist(分组依据保证分类一致) catlist = group.First().catlist, // 扁平化合并所有分组内的explist explist = group.SelectMany(g => g.explist).ToList() }) .ToList();
四、特殊场景处理
如果你的catlist可能包含多个分类,且需要按所有分类的组合(不考虑顺序)分组,可以修改分组键的生成逻辑:
.GroupBy(item => new { item.pname, // 拼接排序后的分类名,确保相同分类集合的项被分到同一组 CategoryCombination = string.Join("|", item.catlist.Select(c => c.categoryName).OrderBy(c => c)) })
内容的提问来源于stack exchange,提问作者ematech
相关产品推荐
相关产品推荐

