汇总来自不同对象的属性值
Posted
技术标签:
【中文标题】汇总来自不同对象的属性值【英文标题】:Sum property values from different objects 【发布时间】:2014-11-18 16:02:08 【问题描述】:我有以下课程:
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
是Data
中List<Data>
的所有DataValueA
s 的总和。
DataValueB
、DataValueC
等也一样。
我试图用 Linq 做到这一点,但现在知道如何了。
【问题讨论】:
向我们展示你到目前为止所获得的。total.DataValueA = yourList.Sum(r=> r.DataValueA);
??这就是你要找的吗?
【参考方案1】:
var total = new Data
DataValueA = list.Sum(x => x.DataValueA),
DataValueB = list.Sum(x => x.DataValueB),
...
;
【讨论】:
【参考方案2】:您可以使用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 DataDataValueA=1,DataValueB=2,DataValueC=3,DataValueD=4,
new DataDataValueA=1,DataValueB=2,DataValueC=3,DataValueD=4,
new DataDataValueA=1,DataValueB=2,DataValueC=3,DataValueD=4,
new DataDataValueA=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 Aggregate algorithm explained
【讨论】:
【参考方案3】:如果您可以对集合进行多次枚举,则可以多次使用list.Sum(item => item.Property)
。如果您只浏览一次列表很重要,例如,因为它是通过过滤器的延迟执行生成的,您可以改用Aggregate
:
var totals = list.Aggregate(new Data(), (prev, item) =>
prev.DataValueA += item.DataValueA;
prev.DataValueB += item.DataValueB;
...
return prev;
);
【讨论】:
以上是关于汇总来自不同对象的属性值的主要内容,如果未能解决你的问题,请参考以下文章