如何从集合中筛选currencyId相同的对象求和,无需逐笔写else if?
实现方案
直接使用LINQ的GroupBy运算符按CurrencyId属性分组,一次性生成所有币种的汇总结果,无需为每个币种单独编写分支逻辑:
// 按CurrencyId分组求和,生成所有币种的汇总 var currencySums = resultModel .GroupBy(q => q.CurrencyId) .Select(g => new ReportModel { AccountName = $"Sum_Currency_{g.Key}", CurrencyId = g.Key, BalanceSum = g.Sum(q => q.Balance) }) .ToList(); // 把汇总结果追加到resultModel中 resultModel.AddRange(currencySums);
如果需要保留你原有的CurrencyId=-1的特殊判断逻辑,可以调整为:
if(model.CurrencyId == -1) { // 生成所有币种的汇总 var allCurrencySums = resultModel .GroupBy(q => q.CurrencyId) .Select(g => new ReportModel { AccountName = "Sum", CurrencyId = g.Key, BalanceSum = g.Sum(q => q.Balance) }); resultModel.AddRange(allCurrencySums); } else { // 只汇总当前选择的币种 resultModel.Add(new ReportModel { AccountName = "Sum", CurrencyId = model.CurrencyId, BalanceSum = resultModel.Sum(q => q.Balance) }); }
补充说明
GroupBy会自动遍历集合,把属性值相同的元素归为一组,分组的Key就是CurrencyId的值,有多少种不同的CurrencyId就会生成多少个分组,无需手动枚举所有可能的币种ID- 如果仅需要汇总某几个指定的
CurrencyId,可以在GroupBy前加Where条件过滤,不需要单独写分支:
// 示例:仅汇总CurrencyId为1、2、3的币种 var targetCurrencyIds = new List<int> {1,2,3}; var sums = resultModel .Where(q => targetCurrencyIds.Contains(q.CurrencyId)) .GroupBy(q => q.CurrencyId) .Select(g => new ReportModel { AccountName = "Sum", BalanceSum = g.Sum(q => q.Balance) }) .ToList(); resultModel.AddRange(sums);
- 如果需要生成全局总合计,可以额外在分组求和后加一条所有余额的求和逻辑即可
内容的提问来源于stack exchange,提问作者Poyraz Kürkçüoğlu
相关产品推荐
相关产品推荐

