汇总来自不同对象的属性值

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

其中DataValueADataList<Data> 的所有DataValueAs 的总和。

DataValueBDataValueC 等也一样。

我试图用 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;
);

【讨论】:

以上是关于汇总来自不同对象的属性值的主要内容,如果未能解决你的问题,请参考以下文章

xsl如何根据来自不同元素的属性汇总一种特定类型元素的总和

Python:来自汇总和 r_squared 函数的不同 R 平方值

Django:显示不同值的对象属性

基础知识回顾:属性

不同场景,this 的指向问题汇总

如何在单个数据表中显示来自不同对象类型的不同值?