1

私は2つのクラスを持っています:

public GeneralClassName 
{
    public GeneralClassName ()
    {
        SpecificList = new List<OtherClass>();
    }
    public string StringValue;
    public string OtherStringValue;
    public List<OtherClass> SpecificList;
}

public OtherClass
{
    public string Name;
    public string Number;
}

JSON デシリアライゼーションの後、 nice を取得します。必要なList<GeneralClassName>結果は、値が inside内Dictionary<string, int>の変数「Number」の合計であり、キーは変数名です。List<OtherClass>List<GeneralClassName>

言い換えれば、数値グループを名前で合計したいと思います。

今、私の頭に浮かんだ唯一のことは、ネストされた foreach のようなものです。

Dictionary<string, int> resultDictionary = new Dictionary<string, int>();
foreach(List<OtherClass> listOtherClass in bigListGeneralClass.Select(x => x.SpecificList))
{
    foreach(OtherClass otherClass in listOtherClass)
    {
        int value = 0;
        if(resultDictionary.ContainsKey(otherClass.Name))
        {
            resultDictionary[otherClass.Name] += otherClass.Number;
        }
        else
        {
            resultDictionary.Add(otherClass.Name, otherClass.Number);
        }
    }
}

このソリューションはうまく機能しているように見えますが、私はまったく好きではありません。この結果を見つけるためのよりクリーンな方法はありますか? 素敵なLINQクエリを介して?

4

2 に答える 2

6

からの情報を使用しないため、リストを平坦化するためにGeneralClassName使用できます。このインスタンスSelectManyのフラット リストは、プロパティによってグループ化されます。最後に、グループのリストは、グループのキー (別名プロパティ) が新しいプロパティのキーであり、値がそのグループ内のすべての値の合計であるディクショナリに変換されます。OtherClassNameNameNumber

var result = bigListGeneralClass.SelectMany(x => x.SpecificList)
                                .GroupBy(x => x.Name)
                                .ToDictionary(x => x.Key,
                                              x => x.Sum(y => y.Number));

OtherClass.Numberこのコードは、が実際には ではintないことを前提としていstringます。この仮定は、ループを含むサンプル コードでも使用されます。
この仮定が正しくない場合は、 に変更y.Numberしてint.Parse(CultureInfo.InvariantCulture, y.Number)ください。
注: 数値のいずれかを解析できない場合は例外がスローされるため、事前にすべての数値に有効な数値が含まれていることを確認することをお勧めします。

于 2012-11-19T15:43:23.503 に答える
0

これを試して:

Dictionary<string, int> result =
            bigListGeneralClass.SpecificList.GroupBy(sl => sl.Name)
                                .ToDictionary(group => group.Key, group => group.Sum(x => Int32.Parse(x.Number)));
于 2012-11-19T16:04:04.797 に答える