2010-11-22 14 views
155

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

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

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

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

उत्तर

153

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

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


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

29

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

5

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

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

शैली के लिहाज से, कम बेहतर :)

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

13

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

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

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

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

अधिकांश परिदृश्यों में यह प्रदर्शन लाभ महत्वहीन है। तो मैं ConcurrentDictionary उपयोग करने के लिए क्योंकि सलाह देने के लिए चाहते हैं:

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