如何使用LINQ的GroupBy对相同partNo记录累加数量并拼接designator
实现方案
完全可以通过LINQ实现你需要的分组聚合逻辑,以下是可直接运行的代码:
你已有定义的Record类:
public class Record { public string partNo { get; set; } public float quantity { get; set; } public string designator { get; set; } }
假设你已经把Excel读取到的原始数据存放在List<Record> originalRecords集合中,使用LINQ方法语法实现分组聚合的代码如下:
List<Record> mergedRecords = originalRecords // 按partNo字段分组,相同partNo的记录会被划分到同一个分组 .GroupBy(r => r.partNo) // 对每个分组进行处理,生成新的Record对象 .Select(group => new Record { partNo = group.Key, // 分组的Key就是当前组对应的partNo值 quantity = group.Sum(item => item.quantity), // 累加当前组所有记录的quantity值 // 拼接当前组所有记录的designator,Trim()用于去掉原始值首尾多余的空格,避免拼接出连续空格 designator = string.Join(" ", group.Select(item => item.designator.Trim())) }) .ToList();
如果你更习惯LINQ查询语法,也可以用以下写法,效果完全一致:
List<Record> mergedRecords = ( from record in originalRecords group record by record.partNo into g select new Record { partNo = g.Key, quantity = g.Sum(item => item.quantity), designator = string.Join(" ", g.Select(item => item.designator.Trim())) } ).ToList();
验证说明
用你提供的示例原始数据运行上述代码,得到的mergedRecords结果和你期望的输出完全一致:
- partNo为
123456789的记录quantity累加为5,designator拼接为C1 C2 C10 C12 C15 - 其余没有重复partNo的记录保持原有数值不变
注意事项
如果你的业务场景中quantity是计数用的整数值,建议把Record类中的quantity类型改为int或者decimal,避免float类型累加时出现精度误差。
内容的提问来源于stack exchange,提问作者Rodo
相关产品推荐
相关产品推荐

