ハッシュ操作であるため、辞書キーの検索と削除のパフォーマンスを考慮し、質問の文言が最善の方法であると考えると、以下は完全に有効なアプローチであり、他のアプローチは少し複雑すぎると思います。
public static void MergeOverwrite<T1, T2>(this IDictionary<T1, T2> dictionary, IDictionary<T1, T2> newElements)
{
if (newElements == null) return;
foreach (var e in newElements)
{
dictionary.Remove(e.Key); //or if you don't want to overwrite do (if !.Contains()
dictionary.Add(e);
}
}
または、マルチスレッド アプリケーションで作業していて、とにかくディクショナリをスレッド セーフにする必要がある場合は、次のようにする必要があります。
public static void MergeOverwrite<T1, T2>(this ConcurrentDictionary<T1, T2> dictionary, IDictionary<T1, T2> newElements)
{
if (newElements == null || newElements.Count == 0) return;
foreach (var ne in newElements)
{
dictionary.AddOrUpdate(ne.Key, ne.Value, (key, value) => value);
}
}
次に、これをラップして、辞書の列挙を処理できるようにします。とにかく、約 ~O(3n) (すべての条件が完璧な場合) を.Add()
見Contains()
ています。あまり良くならないと思います。
大規模なコレクションで余分な操作を制限したい場合はCount
、マージしようとしている各ディクショナリを合計し、ターゲット ディクショナリの容量をそれに設定する必要があります。これにより、後のサイズ変更のコストが回避されます。だから、最終製品はこのようなものです...
public static IDictionary<T1, T2> MergeAllOverwrite<T1, T2>(IList<IDictionary<T1, T2>> allDictionaries)
{
var initSize = allDictionaries.Sum(d => d.Count);
var resultDictionary = new Dictionary<T1, T2>(initSize);
allDictionaries.ForEach(resultDictionary.MergeOverwrite);
return resultDictionary;
}
このメソッドに を取り入れたことに注意してくださいIList<T>
...ほとんどの場合、 を取り入れた場合IEnumerable<T>
、同じセットの複数の列挙に自分自身を開いたためです。これは、遅延 LINQ から辞書のコレクションを取得した場合、非常にコストがかかる可能性があります。声明。