शब्दकोश में नया जोड़ने या मौजूदा आइटम को अपडेट करने की विधि


235

कुछ विरासत कोड में, मुझे एक नया कुंजी-मूल्य आइटम जोड़ने या यदि पहले से मौजूद कुंजी है, तो मूल्य को अपडेट करने की सुविधा के लिए निम्नलिखित विस्तार विधि देखें।

विधि -1 (विरासत कोड)।

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{            
    if (map.ContainsKey(key))
    {
        map[key] = value;
    }
    else
    {
        map.Add(key, value);
    }
}

हालाँकि, मैंने जाँच की है कि map[key]=value बिल्कुल वही काम करता है। यही है, इस विधि को नीचे विधि -2 से बदला जा सकता है।

विधि-2।

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{
    map[key] = value;
}

अब, मेरा प्रश्न यह है कि क्या कोई समस्या हो सकती है यदि मैं विधि -2 द्वारा विधि -1 को प्रतिस्थापित कर दूं? क्या यह किसी भी संभावित परिदृश्य में टूट जाएगा?

इसके अलावा, मुझे लगता है कि यह हैशटेबल और डिक्शनरी के बीच का अंतर था। हैशटेबल किसी आइटम को अपडेट करने की अनुमति देता है, या इंडेक्सर का उपयोग करके एक नया आइटम जोड़ने की अनुमति देता है, जबकि शब्दकोश नहीं करता है !! क्या यह अंतर C #> 3.0 संस्करणों में समाप्त हो गया है?

यदि उपयोगकर्ता समान कुंजी-मान फिर से भेजता है, तो इस पद्धति का उद्देश्य भी अपवाद नहीं है, विधि को नए मान के साथ प्रविष्टि को अद्यतन करना चाहिए, और यदि नया कुंजी-मान युग्म विधि में भेजा गया है तो एक नई प्रविष्टि करें ।

जवाबों:


243

क्या कोई समस्या हो सकती है अगर मैं Method-1 द्वारा Method-1 को बदल दूं?

नहीं, बस उपयोग करें map[key] = value। दो विकल्प बराबर हैं।


Dictionary<>बनाम के बारे में Hashtable: जब आप परावर्तक शुरू करते हैं, तो आप देखते हैं कि डुप्लिकेट कुंजी सम्मिलित करते समय, अनुक्रमणिका दोनों वर्गों के कॉल this.Insert(key, value, add: false);और addपैरामीटर अपवाद को फेंकने के लिए जिम्मेदार है। तो व्यवहार दोनों वर्गों के लिए समान है।


44

वहां कोई समस्या नहीं है। मैं CreateNewOrUpdateExistingस्रोत से भी हटा दूंगा और map[key] = valueसीधे आपके कोड में उपयोग करूंगा , क्योंकि यह बहुत अधिक पठनीय है, क्योंकि डेवलपर्स आमतौर पर map[key] = valueइसका मतलब जानते होंगे ।


22

पुराना प्रश्न लेकिन मुझे लगता है कि मुझे निम्नलिखित जोड़ना चाहिए, और भी अधिक क्योंकि .net 4.0 प्रश्न लिखे जाने के समय पहले ही लॉन्च हो चुका था।

.Net 4.0 के साथ शुरू होने वाला नाम स्थान है System.Collections.Concurrentजिसमें संग्रह शामिल हैं जो थ्रेड-सुरक्षित हैं।

संग्रह System.Collections.Concurrent.ConcurrentDictionary<>वही करता है जो आप चाहते हैं। यह AddOrUpdate()थ्रेड-सुरक्षित होने के अतिरिक्त लाभ के साथ विधि है।

यदि आप उच्च-प्रदर्शन परिदृश्य में हैं और कई थ्रेड संभाल नहीं map[key] = valueरहे हैं तो पहले से दिए गए उत्तर तेजी से हैं।

अधिकांश स्थितियों में यह प्रदर्शन लाभ नगण्य है। यदि ऐसा है तो मैं समवर्ती छाया का उपयोग करने की सलाह दूंगा क्योंकि:

  1. यह ढांचे में है - यह अधिक परीक्षण किया गया है और आप वह नहीं हैं जिसे कोड बनाए रखना है
  2. यह स्केलेबल है: यदि आप अपने कोड को मल्टीथ्रेडिंग पर स्विच करते हैं तो इसके लिए पहले से ही तैयार है

7

कार्यात्मक रूप से, वे समकक्ष हैं।

प्रदर्शन-वार map[key] = valueतेज होगा, क्योंकि आप केवल दो के बजाय एकल लुकअप कर रहे हैं।

शैली-वार, छोटी बेहतर :)

अधिकांश मामलों में कोड बहु-थ्रेडेड संदर्भ में ठीक काम करेगा। यह हालांकि अतिरिक्त सिंक्रनाइज़ेशन के बिना थ्रेड-सुरक्षित नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.