1

List[B] を持つクラス C があり、各 B には Dictionary[A, double] があります。

現在私がやっているAあたりの最大(倍)を選択する必要があります:

Dictionary<A,double> rtn = new Dictionary<A,double>();
foreach (var B in C.Bs)
{
    foreach (var kvpA in B.A_list.Where(a => !rtn.Keys.ToList().Contains(a)))
    {
        rtn.Add(kvpA.Key, kvpA.Value);
    }
    foreach(var kvpA in B.A_list.Where(a => rtn.Keys.Contains(a) && a.Value>rtn[a]))
    {
        rtn[kvpA.Key] = kvpA.Value;
    }
}
return rtn;

ただし、これはかなり面倒なので、より良い linq クエリを作成しようとしていますが、構文がわかりません。助けはありますか?

4

1 に答える 1

5

A_Listsmax(int) は、実際には辞書のように見えるすべての一意の A ごとの最大 double のように、「最大」を意味していると仮定します。

とにかく、これはすべて 1 つの LINQ ステートメントで 3 つの手順で実行できます。

  1. SelectManyを使用してすべてのキーと値のペアを折りたたむ
  2. GroupByを使用して一意の A でグループ化する
  3. ToDictionaryを使用して A キーごとに最大 double を取得します

cclass のインスタンスはどこにありますかC:

var dct = c.Bs.SelectMany(x => x.A_List)
            .GroupBy(p => p.Key, p => p.Value)
            .ToDictionary(g => g.Key, g => g.Max());

ToDictionary の代わりにToLookupを使用することもできます。これ[A, double]により、ToDictionary によって具体化されたのと同じタプルに対して IEnumerable イテレーターが生成されます。

于 2013-02-18T14:37:06.923 に答える