शब्दकोश कुंजी के लुकअप और डिलीट के प्रदर्शन को ध्यान में रखते हुए, क्योंकि वे हैश ऑपरेशन हैं, और प्रश्न के शब्दों पर विचार करना सबसे अच्छा तरीका था , मुझे लगता है कि नीचे एक पूरी तरह से मान्य दृष्टिकोण है, और अन्य थोड़ा अधिक जटिल हैं, आईएमएचओ।
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);
}
}
आप इसे तब ले सकते हैं, ताकि इसे शब्दकोशों का एक संग्रह बना सकें। भले ही, आप दृश्यों के पीछे .Add()
एक अतिरिक्त, अनावश्यक लेकिन व्यावहारिक रूप से मुक्त होने के बाद से, ~ O (3n) (सभी स्थितियों के सही होने) के बारे में देख रहे हैं 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 से डिक्शनरी का कलेक्शन मिल गया है बयान।
dicA.Concat(dicB).ToDictionary(kvp => kvp.Key, kvp => kvp.Value)