我有一个类,它包含一个类列表,其中包含一个类列表,如下所示:
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的值总和:
我可以在循环内部使用许多循环,但似乎应该有一种更有效的方法。
答案 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()
});
由于内部使用循环,因此与循环代码相比,不确定它的速度有多快。