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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:23:21