如何按Project属性对List<Data>对象分组并累加Value属性值?
简洁高效的分组累加方案(Linq实现)
嘿,你完全不用纠结复杂的嵌套循环或者手动维护Dictionary——C#的Linq就是为这种分组聚合场景量身定做的!用它来实现按Project分组并累加Value,代码简洁到离谱,而且可读性和效率都拉满。
先看核心实现代码
假设你已经有了填充好的List<Data>集合:
// 示例数据 var dataList = new List<Data> { new Data { Project = "Test", Value = 1 }, new Data { Project = "Test", Value = 5 }, new Data { Project = "Test", Value = 25 }, new Data { Project = "Others", Value = 89 }, new Data { Project = "Others", Value = 151 } };
方案1:直接获取分组后的键值对集合
这是最基础的写法,返回每个Project对应的总Value:
var projectTotals = dataList .GroupBy(item => item.Project) // 按Project属性分组 .Select(group => new KeyValuePair<string, double>( group.Key, // 分组的键(也就是Project名称) group.Sum(item => item.Value) // 组内所有Value的总和 ));
方案2:转换成Dictionary(方便快速查找)
如果之后需要通过Project名称快速查询总Value,直接转成Dictionary更实用:
var projectTotalDict = dataList .GroupBy(item => item.Project) .ToDictionary( group => group.Key, group => group.Sum(item => item.Value) ); // 用法示例:获取"Test"的总Value double testTotal = projectTotalDict["Test"]; // 结果是31
方案3:返回List类型结果
如果需要保持返回结果和原数据类型一致(每个Project对应一个总Value的Data对象):
var totalDataList = dataList .GroupBy(item => item.Project) .Select(group => new Data { Project = group.Key, Value = group.Sum(item => item.Value) }) .ToList();
为什么这个方案比你之前的尝试更好?
- 代码简洁易读:链式调用的Linq语法几乎是“语义化”的,一眼就能看懂是在分组然后求和,完全没有嵌套循环的混乱。
- 效率有保障:Linq的GroupBy内部已经做了优化,性能和手动维护Dictionary不相上下,但不用自己写繁琐的判断和累加逻辑,避免出错。
- 灵活性高:可以根据需求轻松转换成键值对、Dictionary或者原数据类型的集合,适配不同的业务场景。
内容的提问来源于stack exchange,提问作者user1845777
相关产品推荐
相关产品推荐

