【问题标题】:Combine multiple lists of classes into 1 list将多个类列表合并为 1 个列表
【发布时间】:2013-10-22 04:18:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# linq list


    【解决方案1】:
    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 对象的单个列表。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-04-18
        • 1970-01-01
        • 2021-06-02
        • 2020-12-03
        • 2015-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-19
        相关资源
        最近更新 更多