将多个类列表合并为一个列表

时间:2013-10-21 20:06:50

标签: c# linq list

我有一个类,它包含一个类列表,其中包含一个类列表,如下所示:

public class grouping
{

    public List<Member> members { get; set; }
    public string group_id { get; set; }
}

public class Member
{
    public string member_id { get; set; }
    public List<vStat> vstats { get; set; }
}

public class vStat
{
    public string t1 { get; set; }
    public string t2 { get; set; }
    public string t3 { get; set; }
    public string v_id { get; set; }
}

每个List vstats包含许多vStats,其中v_id每个列表只出现一次,但每个成员vstats列表将重复这些v_id。 t1,2和3都是整数,但不幸的是存储在字符串中。如果需要的话,我可以提前投出它们,但希望能一次完成这一切。

我想要做的是将每个成员vstats列表合并为所有成员的单个列表,每个v_id有一个值,t1,t2,t3的值总和:

我可以在循环内部使用许多循环,但似乎应该有一种更有效的方法。

2 个答案:

答案 0 :(得分:3)

members.SelectMany(m => m.vstats)
       .GroupBy(v => v.v._id)
       .Select(g => new vStat {
           t1 = g.Sum(x => Int32.Parse(x.t1)).ToString(),
           t2 = g.Sum(x => Int32.Parse(x.t2)).ToString(),
           t3 = g.Sum(x => Int32.Parse(x.t3)).ToString(),         
           v_id = g.Key
       });

此查询返回所有成员的聚合vStat对象的单个列表。

答案 1 :(得分:1)

如果您有List<grouping>,那么您可以先使用members展平其vStats然后SelectMany,然后将结果投影为:

List<grouping> groupList = new List<grouping>();
var result = groupList.SelectMany(grp=> grp.members)
                      .SelectMany(mem=> mem.vstats)
                      .GroupBy(v => v.v_id)
                      .Select(vgrp=> new vStat 
                      {
                          v_id = vgrp.Key, 
                          t1 = vgrp.Sum(r=> int.Parse(r.t1)).ToString(),
                          t2 = vgrp.Sum(r=> int.Parse(r.t2)).ToString(),
                          t3 = vgrp.Sum(r=> int.Parse(r.t3)).ToString()
                      });

由于内部使用循环,因此与循环代码相比,不确定它的速度有多快。