Sözlük anahtar aramaları ve silmelerin hash işlemleri olduğu için performansı göz önüne alındığında ve sorunun ifadesinin en iyi yol olduğunu düşünürsek, aşağıda mükemmel bir geçerli yaklaşım olduğunu düşünüyorum ve diğerleri biraz fazla karmaşık, 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);
}
}
VEYA çok iş parçacıklı bir uygulamada çalışıyorsanız ve sözlüğünüzün yine de iş parçacığı güvenli olması gerekiyorsa, bunu yapmanız gerekir:
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);
}
}
Daha sonra bir sözlük numaralandırma işlemek için bunu sarmak olabilir. Ne olursa olsun, ~ O (3n) 'ye bakıyorsunuz (tüm koşullar mükemmel), çünkü perde arkasında .Add()
ek, gereksiz ama pratik olarak ücretsiz olacak Contains()
. Çok daha iyi olduğunu sanmıyorum.
Büyük koleksiyonlardaki ekstra işlemleri sınırlamak Count
istiyorsanız, birleştirmek üzere olduğunuz her sözlüğü özetlemeli ve hedef sözlüğün kapasitesini buna ayarlamalı ve bu da daha sonra yeniden boyutlandırma maliyetini ortadan kaldırmalıdır. Yani, son ürün böyle bir şey ...
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>
Bu yönteme dikkatimi çektiğimi unutmayın ... çünkü eğer bir alırsanız IEnumerable<T>
, kendinizi aynı setin birden fazla numaralandırmasına açtınız, bu da ertelenmiş bir LINQ'dan sözlük koleksiyonunuzu aldıysanız çok maliyetli olabilir. Beyan.
dicA.Concat(dicB).ToDictionary(kvp => kvp.Key, kvp => kvp.Value)