我的代码类似于:
decimal total1 = 0;
decimal poTotal = 0;
foreach( var record in listOfRecords)
{
total1 += record.Price;
if ( record.HasPo){
poTotal += record.PoTotal;
}
}
这很好但我想知道如何使用linq执行多个聚合而不需要对组等进行过多编码...是否有一种简单的方法,不需要每次都扫描对象列表?
我知道我可以这样做:
var poTotal = listOfRecords.Where(r=> r.HasPo).Sum(r.PoTotal);
但这需要扫描整个列表,如果我要聚合多个值,我只想循环/扫描一次。
答案 0 :(得分:4)
您可以使用Aggregate
方法,但我认为它不比您已有的简单foreach
循环更清晰:
var totals = listOfRecords.Aggregate(
new { Total = 0m, PoTotal = 0m },
(a, r) => new {
Total = a.Total + r.Price,
PoTotal = a.PoTotal + (r.HasPo ? r.PoTotal : 0m)
});
Console.WriteLine(totals.Total);
Console.WriteLine(totals.PoTotal);
答案 1 :(得分:2)
你可以也做这样的事情:
decimal poTotal = 0;
decimal total = listOfRecords.Sum(record => {
if (record.HasPo) {poTotal += record.PoTotal;}
return record.Price;
});
但我不是说你应该。正如MarcinJurasek所说,简单的foreach
在这种情况下是最清晰的。