2016-11-20 15 views
1

を値を追加した値は、一緒に追加よりも、一つに複数の辞書を集約する任意のより効率的な方法があり、重複キーがありますか?辞書には、少なくとも10000のキーと値のペアがあります。集約複数の辞書、一緒に

Dictionary<string, int>[] res; 
Dictionary<string, int> aggregatedRes = res[0]; 
for (int i = 1; i < res.Length; i++) 
{ 
    foreach (KeyValuePair<string, int> valuePair in res[i]) 
    { 
     if (aggregatedRes.ContainsKey(valuePair.Key)) 
     { 
      aggregatedRes[valuePair.Key] += valuePair.Value; 
     } 
     else 
     { 
      aggregatedRes.Add(valuePair.Key, valuePair.Value); 
     } 
    } 
} 

私は同様の質問をstackoverflowの上のポストをたくさん見つけましたが、重複キーがあった場合、彼らはちょうど私のために良いされていない、それの一つの値をドロップします。

Dictionary 1 
apple - 2 
an - 1 
I - 1 
like - 3 

Dictionary 2 
apple - 3 
car - 1 
green - 1 

Dictionary 3 
apple - 1 
green - 1 
like - 1 

Expected result: 
apple - 6 
an - 1 
I - 1 
like - 4 
car - 1 
green - 2 
+1

'同様の質問でstackoverflowに多くの投稿が見つかりましたが、重複するキーがある場合は、それです。だから、あなたはそれらを合計するためにそれらを修正することはできません.... –

+0

残念ながら、私はそれを行うことができます、私は行う方法を尋ねていません – golddragon007

+2

OK次に、コンパイル可能なコードを掲示し、あなたは+を取得compilabeコード+サンプル入力+何が「出力を期待します。 –

答えて

1

あなたがすでに行っているものよりもはるかに優れた魔法の方法はありません。

for (int i = 1; i < res.Length; i++) 
{ 
    foreach (KeyValuePair<string, int> valuePair in res[i]) 
    { 
     int value; 
     aggregatedRes.TryGetValue(valuePair.Key, out value); 
     aggregatedRes[valuePair.Key] = value + valuePair.Value; 
    } 
} 

を何もない場合、それは少し短いです:(。LINQを持つ任意のトリックは、パフォーマンスが改善されません)若干の改善は次のようにループを変更することがあるかもしれません。我々は一度だけaggregatedRes上で検索を行うことができれば

は本当に助けは何だったのだろうが、私はそれを行うための手立てを見ません。

+0

はまあ、はい、いいえがあります。私の友人の一人がLINQで設定された大きなデータのベンチマークを行い、通常の「foreach」と「for」のステートメントでベンチマークを行ったため、あなたのLINQステートメントではわかりません。 appr。彼らが同じことをしたときに他のものよりも33%速くなりました。 – golddragon007

+0

@ golddragon007:私はLINQの策定に興味があります。意見は、もちろん、測定に屈する必要があります。 :-) –

0

は、パフォーマンスをテストしていませんが、LINQを使用して方法は、グループ値を合計、辞書(selectmany)を平らにすべてのキーのグループと、新しい辞書を作成する次のようになります。

var aggregatedRes = (from d in res 
      from kv in d 
      group kv by kv.Key) 
     .ToDictionary(g=>g.Key, g=>g.Sum(kv=>kv.Value)); 

(大規模辞書を使用した場合、上記のコードはfrom d in res.AsParallel()を使用して並列処理を行います)