如何将嵌套foreach循环转换为单个LINQ语句计算费用合计?
用单个LINQ语句实现嵌套循环的累加计算
没问题,这就帮你解决这个问题!你之前的代码报错是因为**List.ForEach()方法返回的是void**——它只是用来对集合中的每个元素执行指定操作,没法直接把它的结果赋值给decimal类型的变量,这就是你看到“无法将类型‘void’转换为‘decimal’”错误的核心原因。
要实现和原嵌套foreach等价的累加逻辑,我们可以用LINQ的SelectMany来扁平化嵌套的集合,再结合Where过滤和Sum求和,直接得到最终的累加值。这里有两种简洁且符合需求的写法:
写法一:完全扁平化后统一求和
这种写法先把所有嵌套的集合逐层展开,再统一筛选求和,逻辑清晰直观:
decimal originalCharges = list .SelectMany(customerOrder => customerOrder.BillTos) // 把所有订单下的BillTos合并成一个序列 .SelectMany(billTo => billTo.Charges) // 再把所有BillTo下的Charges合并成一个序列 .Where(charge => rdns.Contains(charge.RateCodeRdn)) // 筛选出RateCodeRdn在rdns列表中的收费项 .Sum(charge => charge.Amount); // 对符合条件的收费项的Amount求和
写法二:先按BillTo求和再汇总
这种写法更贴近你原代码的嵌套逻辑,先计算每个BillTo下符合条件的Charges总和,再把所有BillTo的结果累加:
decimal originalCharges = list .SelectMany(customerOrder => customerOrder.BillTos) .Sum(billTo => billTo.Charges .Where(charge => rdns.Contains(charge.RateCodeRdn)) .Sum(charge => charge.Amount));
这两种写法都完全等价于你原来的嵌套foreach循环,而且都是单个LINQ语句实现,不需要手动声明累加变量再逐个赋值。
内容的提问来源于stack exchange,提问作者shaun
相关产品推荐
相关产品推荐

