LINQ和多个聚合
本文关键字:LINQ | 更新日期: 2023-09-27 18:18:29
我有类似这样的代码:
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);
但是这需要扫描整个列表,如果我要聚合多个值,我只想循环/扫描一次
您可以使用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);
你也可以这样做:
decimal poTotal = 0;
decimal total = listOfRecords.Sum(record => {
if (record.HasPo) {poTotal += record.PoTotal;}
return record.Price;
});
但我不是说你应该。正如MarcinJurasek所说,在这种情况下,简单的foreach
是最清楚的。