2

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

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 的值的总和:

我可以通过循环内的多个循环来做到这一点,但似乎应该有一种更有效的方法来做到这一点。

4

2 回答 2

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此查询返回所有成员的聚合对象的单个列表。

于 2013-10-21T20:12:49.200 回答
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()
                      });

不太确定它与循环代码相比有多快,因为它在内部使用循环。

于 2013-10-21T20:18:47.603 回答