LINQ和多个聚合

时间:2014-08-18 23:50:04

标签: c# linq

我的代码类似于:

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

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

2 个答案:

答案 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在这种情况下是最清晰的。