Considerando le prestazioni delle ricerche e delle cancellazioni dei tasti del dizionario poiché sono operazioni di hash e considerando che la formulazione della domanda è stata il modo migliore , penso che di seguito sia un approccio perfettamente valido e gli altri sono un po 'troppo complicati, 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);
}
}
OPPURE se stai lavorando in un'applicazione multithread e il tuo dizionario deve comunque essere thread-safe, dovresti farlo:
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);
}
}
È quindi possibile racchiuderlo per farlo gestire un elenco di dizionari. Indipendentemente da ciò, stai guardando a ~ O (3n) (tutte le condizioni sono perfette), dal momento .Add()
che farà un ulteriore, inutile ma praticamente gratuito,Contains()
dietro le quinte. Non penso che sia molto meglio.
Se si desidera limitare le operazioni extra su raccolte di grandi dimensioni, è necessario riassumere il Count
dizionario di ciascun dizionario che si sta per unire e impostare la capacità del dizionario di destinazione su quella, evitando così i successivi costi di ridimensionamento. Quindi, il prodotto finale è qualcosa di simile ...
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;
}
Nota che ho seguito IList<T>
questo metodo ... soprattutto perché se ne prendi uno IEnumerable<T>
, ti sei aperto a più enumerazioni dello stesso set, il che può essere molto costoso se ottieni la tua raccolta di dizionari da un LINQ differito dichiarazione.
dicA.Concat(dicB).ToDictionary(kvp => kvp.Key, kvp => kvp.Value)