2012-05-01 13 views
1

私はそうのようなTValueToString()方法を連結して1 IDictionary<TKey, string>に二つ以上のIDictionary<TKey, TValue>オブジェクトをマージするヘルパーを持っている:IDictionaryのマージ - これより効率的な方法はありますか?

public class DictionaryHelper<TKey, TValue> 
{ 
    public static IDictionary<TKey, string> MergeDictionaries<TKey, TValue>(params IDictionary<TKey, TValue>[] dictionaries) where TValue : class 
    { 
     var returnValue = new Dictionary<TKey, string>(); 
     foreach (var dictionary in dictionaries) 
     { 
      foreach (var kvp in dictionary) 
      { 
       if (returnValue.ContainsKey(kvp.Key)) 
       { 
        returnValue[kvp.Key] += kvp.Value.ToString(); 
       } 
       else 
       { 
        returnValue[kvp.Key] = kvp.Value.ToString(); 
       } 
      } 
     } 
     return returnValue; 
    } 

} 

これは簡単で読みするのは簡単ですがそこにあるべきように、それはそうこれを行うより効率的な方法です。ある?

+0

[ 'kvp.Value'は' null'なのでことができます。]を覚えておいてくださいます(http:// MSDNマイクロソフトコーポレーション、マイクロソフト、マイクロソフト、マイクロソフト、マイクロソフト、マイクロソフト、マイクロソフト、マイクロソフト、マイクロソフト、マイクロソフト、マイクロソフト、 – user7116

+0

えええええええええええええええええええええええええええええええええええええええええええええええ投稿日時:それを指摘してくれてありがとう。パフォーマンスは効率的です...私は少し前向きに努力しても構いません。 –

+1

これは参考になるかもしれません:http://stackoverflow.com/questions/712927/how-to-add-2-dictionary-contents-without-looping-in-c-sharp –

答えて

7

これは、より効率的であるかどうかは知りませんが、少なくともそれは、はるかに短いです:

var result = dictionaries.SelectMany(d => d) 
         .ToLookup(kvp => kvp.Key, kvp => kvp.Value) 
         .ToDictionary(g => g.Key, g => string.Concat(g)); 
+0

これについて良いベンチマークを書くことができるかどうかがわかります。 –

+0

@JeremyHolovacs:私たちがあなたのベースラインをベースラインとして使用している場合、それらはすべてほぼ均等になっています。 (*このコメントの前のバージョンには、タイミングの遅れた辞書の作成が含まれていました*) – user7116

+0

面白い。したがって、コンパイラはそれらを同じ、多かれ少なかれ扱います。それはすべての可読性になります。 –

0

TryGetValueを使用して、ソース値の場所と検索を組み合わせることができます。

1

あなたは削除でき見えるforeachSelectManyで:

var merged = dictionaries.SelectMany(dd => dd) 
         .GroupBy(kvp => kvp.Key, kvp => kvp.Value) 
         .ToDictionary(
          gg => gg.Key, 
          gg => String.Concat(gg)); 

しかし、これはより効率的または読みになりそうではありません。

foreach (var kvp in dictionaries.SelectMany(dd => dd)) 
{ 
    if (returnValue.ContainsKey(kvp.Key)) 
    { 
     returnValue[kvp.Key] += kvp.Value.ToString(); 
    } 
    else 
    { 
     returnValue[kvp.Key] = kvp.Value.ToString(); 
    } 
} 

そして、あなたはこれをさらに拡張することができ、although dtb's is more elegant and efficientあなたの現在のアプローチよりも。

+0

あなたは '.GroupBy(kvp =>) (kvp => kvp.Key、kvp => kvp.Value).ToDictionary(g => g.Key、g => string.Concat(g)) '。だからToLookupの代わりにGroupByを除いて私の答えとまったく同じです。もっと効率的だと思います... – dtb

+0

L2Oでは違いが見られないと言っています.ILSpyはL2Oで 'GroupBy'を使うと' Lookup への呼び出しを単純に延期します.Cyate () 'これは' ToLookup'が直ちに使うものです。違いがあることは確かではありません。ただし、私が「ルックアップ」をオンザフライで作っていることを除いて、あなたはすでにそれを持っています。 – user7116

関連する問題