对不同对象的属性值求和
本文关键字:属性 求和 对象 | 更新日期: 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();
其中DataValueA
是List<Data>
Data
项中所有DataValueA
的总和。
DataValueB
、DataValueC
等也是如此。
我试图用 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;
});