【问题标题】: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); ??这就是你要找的吗?

标签: c#


【解决方案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 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 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;
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 2020-12-23
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多