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);

但是这需要扫描整个列表,如果我要聚合多个值,我只想循环/扫描一次

LINQ和多个聚合

您可以使用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是最清楚的。