Sum List <t> List <t>

时间:2017-03-10 09:34:23

标签: c# .net linq list lambda

请参阅ff。代码:

MainObj:

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

SubObj:

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

问题:我有List<MainObj>。每个项目的SubObj数量相等。如何将SubObj中每个MainObj A的值与对应于与列表中其他SubObj中的MainObj相同的索引的值相加。

进一步说明:

结果:

{
    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有一种更简单的方法。

很抱歉,如果我无法为我的问题说出正确的话。我希望插图有所帮助。

非常感谢每一位帮助。的 CHEERS!

3 个答案:

答案 0 :(得分:5)

据我所知,您需要寻找类似的问题:

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

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

答案 1 :(得分:1)

我会扩展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

答案 2 :(得分:1)

为了灵活性和略微提升的性能,我更喜欢混合的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) 
             };