Mempertimbangkan kinerja pencarian kunci kamus dan menghapus karena mereka operasi hash, dan mempertimbangkan kata-kata dari pertanyaan itu adalah cara terbaik , saya pikir di bawah ini adalah pendekatan yang benar-benar valid, dan yang lain agak terlalu rumit, IMHO.
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);
}
}
ATAU jika Anda bekerja di aplikasi multithreaded dan kamus Anda tetap aman utas, Anda harus melakukan ini:
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);
}
}
Anda kemudian dapat membungkus ini untuk membuatnya menangani enumerasi kamus. Apapun, Anda sedang melihat ~ O (3n) (semua kondisi menjadi sempurna), karena .Add()
akan melakukan tambahan, tidak perlu tetapi praktis gratis,Contains()
belakang layar. Saya tidak berpikir itu menjadi lebih baik.
Jika Anda ingin membatasi operasi tambahan pada koleksi besar, Anda harus meringkas Count
setiap kamus yang akan Anda gabungkan dan atur kapasitas kamus target menjadi itu, yang menghindari biaya pengubahan ukuran nanti. Jadi, produk akhir adalah sesuatu seperti ini ...
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;
}
Perhatikan bahwa saya menggunakan IList<T>
metode ini ... sebagian besar karena jika Anda mengambil dalam IEnumerable<T>
, Anda telah membuka diri untuk beberapa enumerasi dari set yang sama, yang bisa sangat mahal jika Anda mendapat koleksi kamus dari LINQ yang ditangguhkan pernyataan.
dicA.Concat(dicB).ToDictionary(kvp => kvp.Key, kvp => kvp.Value)