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 はリストごとに 1 回しか発生しませんが、各メンバーの vstats リストはこれらの v_id を繰り返します。t1、2、3 はすべて整数ですが、残念ながら文字列に格納されています。必要に応じてもっと早くキャストすることもできますが、これらすべてを一度に行うことを望んでいました。

私がやりたいことは、各メンバー vstats リストをすべてのメンバーの単一のリストに結合し、各 v_id の単一の値と t1、t2、t3 の値の合計です。

ループ内の複数のループでこれを行うことができますが、これを行うにはもっと効率的な方法があるはずです。

4

2 に答える 2

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 に答える