【问题标题】:Sum List<T> Properties of each item in List<T>总和 List<T> List<T> 中每个项目的属性
【发布时间】:2017-03-10 09:34:22
【问题描述】:

请参考ff。代码:

MainObj:

public class MainObj {
    public string Name { get; set; }
    public int SomeProperty { get; set; }
    public List<SubObj> Subojects { get; set; }
}

子对象:

public class SubObj {
    public string Description { get; set; }
    public decimal Value { get; set; }
}

问题:我有一个List&lt;MainObj&gt;。每个项目都有相同数量的SubObj。如何将 MainObj A 中的每个 SubObj 的值求和,这与列表中另一个 MainObj 中的 SubObj 对应的索引相同。

进一步说明:

结果:

{
    Name: "something....",
    Value: SUM(MainObj_A.SubObj[0], MainObj_B.SubObj[0] .... MainObj_n.SubObj[0]
},
{
    Name: "don't really care...."
    Value: SUM(MainObj_A.SubObj[1], MainObj_B.SubObj[1] .... MainObj_n.SubObj[1]
},
{
    Name: "don't really care...."
    Value: SUM(MainObj_A.SubObj[2], MainObj_B.SubObj[2] .... MainObj_n.SubObj[2]
}
.... so on and so forth

我知道我可以遍历MainObj 中的每个项目然后执行求和,但我希望有一个更简单的方法使用Linq

很抱歉,如果我不能为我的问题提出正确的措辞。我希望插图有所帮助。

每一个帮助将不胜感激。 干杯!

【问题讨论】:

    标签: c# .net linq list lambda


    【解决方案1】:

    据我了解,您正在寻找这样的问题:

    var results = list.Select((m, i) => new 
              {
                 m.Name, 
                 Value = list.Sum(t => t.SubObj[i].Value)
              }).ToList();
    

    这将创建一个匿名类型列表,其中包含每个主对象的名称以及与主对象具有相同索引的所有子对象值的总和。


    从您的问题中不清楚,但是如果您想对 所有 个子对象求和(不仅与主要对象一样多),您可以这样做:

    var results = Enumerable.Range(0, list[0].SubObj.Count)
                            .Select(i => list.Sum(m => m.SubObj[i].Value)).ToList();
    

    这为您提供了总和列表(没有名称,因为您的示例表明您“并不真正关心”任何名称)。

    【讨论】:

    • 如果 OP 将有一个包含 2 个 mainItems 的列表,每个包含 3 个子项,您的代码将生成包含 2 个项目的列表(subitem1 的总和和 subitem2 的总和),但 op 想要一个 3 个列表项目(每个子项目的总和)。
    • @MaksimSimkin 这个问题并不是很清楚,但我在答案中添加了一个版本。
    • @MaksimSimkin 是正确的。不过,我会调查你包含的答案
    【解决方案2】:

    为了灵活性和稍微提高性能,我更喜欢混合 LINQ-sql 方式,如下面的回答所示。

    var result = from x in list
                 where x...
                 group x by x.SomeProperty 
                 into item
                 select new {
                 Id = item.Key,
                 Name = item.Name,
                 Value = item.SubObj.Sum(i => i.Value) 
                 };
    

    【讨论】:

      【解决方案3】:

      我会扩展 Rene 的解决方案,总结所有子项:

      var result = list.First().Subojects.Select((m, i) => new
      {
          Name = i.ToString(),
          Value = list.Sum(t => t.Subojects[i].Value)
      }).ToList();
      

      我已经使用了这个值:

      var list = new List<MainObj>
      {
          new MainObj { Name = "A", Subojects = new List<SubObj>{new SubObj{ Value = 1}, new SubObj{ Value = 2}, new SubObj{ Value = 3}}},
          new MainObj { Name = "B", Subojects = new List<SubObj>{new SubObj{ Value = 1}, new SubObj{ Value = 2}, new SubObj{ Value = 3}}}
      };
      

      结果是:

      0:2
      1:4
      2:6

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 2019-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多