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

如何在LINQ中按多字段分组并嵌套其余差异字段?

解决LINQ按多字段分组并嵌套其余字段的问题

你的问题核心在于只按单个字段分组,而没有把ITEM_NAME和对应的描述字段(比如你示例里的item1,假设实体类里叫ItemDescription)一起作为分组依据。我们需要调整分组键,同时构造嵌套结构来存储每组的其他字段。

原代码的问题

你之前的代码:

Itm.GroupBy(x => x.ITEM_NAME).Select(x => x.ToList()).ToList();

仅以ITEM_NAME作为分组键,所以只要ITEM_NAME相同就会被分到一组,无法区分同一ITEM_NAME下不同描述的记录,自然达不到你想要的合并效果。

正确实现步骤

假设你的实体类结构大致如下(根据你的示例调整字段名,替换成你实际的字段即可):

public class Item
{
    public string ITEM_NAME { get; set; } // 对应sample1
    public string ItemDescription { get; set; } // 对应item1
    public string Rule { get; set; } // 对应Rule2、test1
    public string RuleMsg { get; set; } // 对应Rule2msg、testrule
    public string ItemInfo { get; set; } // 对应iteminfo2、iteminfo1
}

1. 按多字段分组

使用匿名类型作为分组键,因为匿名类型会自动根据属性值生成Equals和GetHashCode方法,能正确识别ITEM_NAME和描述都相同的记录:

var groupedItems = Itm
    .GroupBy(item => new { item.ITEM_NAME, item.ItemDescription })
    .Select(group => new 
    {
        // 提取分组的两个键
        SampleName = group.Key.ITEM_NAME,
        ItemName = group.Key.ItemDescription,
        // 嵌套存储每组的其余字段
        Details = group.Select(item => new 
        {
            Rule = item.Rule,
            RuleMsg = item.RuleMsg,
            ItemInfo = item.ItemInfo
        }).ToList()
    })
    .ToList();

2. 强类型输出(可选)

如果需要强类型的结果而非匿名类型,可以定义DTO类来存储分组后的数据:

// 定义分组后的结构
public class GroupedItem
{
    public string SampleName { get; set; }
    public string ItemName { get; set; }
    public List<ItemDetail> Details { get; set; }
}

// 定义嵌套的详情结构
public class ItemDetail
{
    public string Rule { get; set; }
    public string RuleMsg { get; set; }
    public string ItemInfo { get; set; }
}

// 调整LINQ查询
var groupedItems = Itm
    .GroupBy(item => new { item.ITEM_NAME, item.ItemDescription })
    .Select(group => new GroupedItem
    {
        SampleName = group.Key.ITEM_NAME,
        ItemName = group.Key.ItemDescription,
        Details = group.Select(item => new ItemDetail
        {
            Rule = item.Rule,
            RuleMsg = item.RuleMsg,
            ItemInfo = item.ItemInfo
        }).ToList()
    })
    .ToList();

最终效果

运行上述代码后,你会得到符合预期的结果:

  • 每个条目对应一组ITEM_NAME和描述都相同的记录
  • Details列表中包含该组内所有不同的其余字段组合,避免了ITEM_NAME和描述的重复

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:41:03