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

本文关键字:列表 合并 | 更新日期: 2023-09-27 18:36:28

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

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

每个列表 vstats 都包含多个 vStat,其中每个列表只出现一次v_id,但每个成员 vstats 列表将重复这些v_id。 t1、2 和 3 都是整数,但不幸的是存储在字符串中。如果需要,我可以更早地投射它们,但希望一次性完成所有这些工作。

我想做的是将每个成员 vstats 列表合并到一个适用于所有成员的列表中,每个v_id都有一个值,t1,t2,t3 的值总和:

我可以使用循环中的许多循环来做到这一点,但似乎应该有一种更有效的方法。

将多个类列表合并为 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对象的单个列表。

如果您有List<grouping>,则可以先展平其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()
                      });

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