对不同对象的属性值求和

本文关键字:属性 求和 对象 | 更新日期: 2023-09-27 18:31:01

我有以下类:

public class Data {
  public Decimal DataValueA { get; set; }
  public Decimal DataValueB { get; set; }
  public Decimal DataValueC { get; set; }
  public Decimal DataValueD { get; set; }
} // Data

我有一个List<Data>.我需要创建一个新的Data对象:

Data total = new Data();

其中DataValueAList<Data> Data项中所有DataValueA的总和。

DataValueBDataValueC等也是如此。

我试图用 Linq 做到这一点,但现在确定如何做。

对不同对象的属性值求和

var total = new Data
{
    DataValueA = list.Sum(x => x.DataValueA),
    DataValueB = list.Sum(x => x.DataValueB),
    ...
};
您可以使用

Sum但这会导致列表上的多次迭代:

var total = new Data
{
    DataValueA = list.Sum(x => x.DataValueA),
    DataValueB = list.Sum(x => x.DataValueB),
    DataValueC = list.Sum(x => x.DataValueC),
    DataValueD = list.Sum(x => x.DataValueD),
};

或者你可以Aggregate,它只会迭代列表一次:

var data = new[]{
            new Data{DataValueA=1,DataValueB=2,DataValueC=3,DataValueD=4},
            new Data{DataValueA=1,DataValueB=2,DataValueC=3,DataValueD=4},
            new Data{DataValueA=1,DataValueB=2,DataValueC=3,DataValueD=4},
            new Data{DataValueA=1,DataValueB=2,DataValueC=3,DataValueD=4},
        };
var result = data.Aggregate(new Data(),(a,b) => {
    a.DataValueA += b.DataValueA; 
    a.DataValueB += b.DataValueB;
    a.DataValueC += b.DataValueC;
    a.DataValueD += b.DataValueD;
    return a;
});

现场示例:http://rextester.com/ODL27846

详细信息:LINQ 聚合算法说明

如果集合的多个枚举对您来说没问题,则可以多次使用list.Sum(item => item.Property)。如果只浏览一次列表很重要,例如,因为它是通过延迟执行筛选器生成的,则可以改用Aggregate

var totals = list.Aggregate(new Data(), (prev, item) => {
     prev.DataValueA += item.DataValueA;
     prev.DataValueB += item.DataValueB;
     ...
     return prev;
});