如何按ProductID合并ProductDMList中相同ID的CabinetList?
按ProductID合并列表对象的实现方案
你目前有这样一组原始数据(JSON格式):
{ "ProductDMList": [ { "ProductID" : 1, "CabinetList": [ { "Min" : 1, "Max" : 12 } ] }, { "ProductID" : 1, "CabinetList": [ { "Min" : 16, "Max" : 100 } ] } ] }
生成这个列表的代码如下:
List<ProductDM> productDMList = _orderRepo.GetSuggestedList(23, 12); for (int i=0;i<productDMList.Count;i++) { productDMList[i].CabinetList.Add(new InventoryDM { Min = productDMList[i].Min, Max = productDMList[i].Max }); } public class ProductDM { public List<InventoryDM> CabinetList { get; set; } public int ProductID { get; set; } public double Min { get; set; } public double Max { get; set; } } public class InventoryDM { public Double Min { get; set; } public Double Max { get; set; } }
你希望合并相同ProductID的对象,把它们的CabinetList合并成一个,预期输出是:
{ "ProductDMList": [ { "ProductID" : 1, "CabinetList": [ { "Min" : 1, "Max" : 12 }, { "Min" : 16, "Max" : 100 } ] } ] }
你尝试过AddRange()和Concat()但没得到预期结果,下面是具体的实现方法:
解决方案:使用LINQ分组合并
你可以利用LINQ的GroupBy方法先按ProductID分组,然后对每个分组创建一个新的ProductDM对象,把分组内所有对象的CabinetList合并进去。具体代码如下:
// 假设你已经有了原始的productDMList var mergedList = productDMList // 按ProductID分组,把相同ID的对象归为一组 .GroupBy(p => p.ProductID) // 对每个分组处理,生成合并后的ProductDM .Select(group => new ProductDM { ProductID = group.Key, // 展开并合并分组内所有对象的CabinetList CabinetList = group.SelectMany(p => p.CabinetList).ToList(), // 按需处理Min/Max字段:这里取分组内的最小Min和最大Max,你也可以根据业务调整逻辑 Min = group.Min(p => p.Min), Max = group.Max(p => p.Max) }) .ToList();
代码细节解释:
- GroupBy(p => p.ProductID):将原始列表中
ProductID相同的对象归类到同一组,每组的Key就是对应的ProductID。 - SelectMany(p => p.CabinetList):把分组内每个对象的
CabinetList展开成一个连续的元素序列,再转成List,就是合并后的完整CabinetList。 - Min/Max字段处理:如果你的业务不需要保留这两个字段,可以直接删除;如果需要,示例中取了分组内的极值,你也可以改成取第一个对象的Min/Max,或者其他符合需求的逻辑。
为什么之前的AddRange/Concat没生效?
大概率是你没有先按ProductID做分组,直接调用这两个方法的话,无法区分哪些对象属于同一ID,自然没法精准合并对应的子列表。先分组再合并,才能确保相同ID的对象的CabinetList被正确整合。
内容的提问来源于stack exchange,提问作者Harsha W
相关产品推荐
相关产品推荐

