c# - शब्दकोश में मौजूदा आइटम को नया या अपडेट करने का तरीका




dictionary (3)

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

विधि -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 को चेक किया है 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 को प्रतिस्थापित करता हूं तो क्या कोई समस्या हो सकती है? क्या यह किसी भी संभावित परिदृश्य में टूट जाएगा?

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

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


यदि मैं विधि-2 विधि-2 को प्रतिस्थापित करता हूं तो क्या कोई समस्या हो सकती है?

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


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


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

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

शैली के अनुसार, बेहतर बेहतर :)

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


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







dictionary