Учитывая производительность поиска по ключевым словам в словаре и удаления , поскольку они являются операциями хэширования, и учитывая, что формулировка вопроса была наилучшим способом , я думаю, что приведенный ниже является совершенно корректным подходом, а другие немного сложнее , ПО МОЕМУ МНЕНИЮ.
public static void MergeOverwrite(this IDictionary dictionary, IDictionary 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(this ConcurrentDictionary dictionary, IDictionary 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 MergeAllOverwrite(IList> allDictionaries)
{
var initSize = allDictionaries.Sum(d => d.Count);
var resultDictionary = new Dictionary(initSize);
allDictionaries.ForEach(resultDictionary.MergeOverwrite);
return resultDictionary;
}
Обратите внимание, что я взял IList
для этого метода. , , в основном потому, что если вы берете IEnumerable
, вы открыли для себя несколько перечислений одного и того же набора, что может быть очень дорогостоящим, если вы получили свою коллекцию словарей из отложенного оператора LINQ.