2010-03-05 5 views
5

जब मैंने पहली बार सी # में प्रोग्राम शुरू करना शुरू किया, तो मैंने तुरंत एसटीएल के मानचित्र के बराबर की तलाश की, और शब्दकोश के बारे में सीखा।क्या कोई यह समझा सकता है कि क्यों <> सी # # एसटीएल में मानचित्र <T,U> की तरह काम नहीं करता है?

अद्यतन नीचे इस कचरे को पार कर गया, मैं पूरी तरह से गलत था। एसटीएल के मानचित्र के साथ मेरा अनुभव यह था कि जब मैंने इसे मूल्य के लिए अनुरोध किया था तो मुझे नफरत थी, और यदि कुंजी मानचित्र में नहीं थी, तो यह स्वचालित रूप से मूल्य प्रकार (जो भी इसके डिफ़ॉल्ट कन्स्ट्रक्टर ने किया था) बनायेगा और इसे मानचित्र में जोड़ देगा। मुझे कोड में इस स्थिति की जांच करनी होगी और अपवाद फेंकना होगा।

शब्दकोश <> पूरे शेबैंग सही हो जाता है - यदि कुंजी नहीं है, तो यदि आप मान का अनुरोध कर रहे हैं तो यह अपवाद फेंकता है, या यदि यह नहीं है और स्वचालित रूप से इसे जोड़ना है तो आप इसे जोड़ना चाहते हैं।

लेकिन आप सभी पहले से ही यह जानते थे। यहां पोस्ट करने से पहले मुझे अपने यूनिट परीक्षणों को लिखा होगा और खुद को शर्मिंदा करना चाहिए। :) वे अब लिखे गए हैं!

अब मैं शब्दकोश और सभी से प्यार है, लेकिन बात यह है कि कीड़े मुझे सबसे ज्यादा के बारे में यह अभी कि अगर कुंजी शब्दकोश में नहीं है, यह एक KeyNotFoundException फेंकता है। इसलिए, मैं हमेशा इस तरह कोड लिखने की जरूरत है:

Dictionary<string,string> _mydic; 

public string this[string key] 
{ 
    get { 
    return _mydic[key]; // could throw KeyNotFoundException 
    } 
    set { 
    if(_mydic.ContainsKey(key)) 
     _mydic[key] = value; 
    else 
     _mydic.Add(key, value); 
    } 
} 

क्यों स्वचालित रूप से डिक्शनरी नहीं करता है तो कुंजी मौजूद नहीं है महत्वपूर्ण मूल्य जोड़ी जोड़ने के लिए, एसटीएल के मानचित्र की तरह?

अब मजाकिया बात यह है कि पिछले जीवन में, मुझे परेशान होता था क्योंकि मुझे अक्सर मानचित्र को रोकने से रोकने की कोशिश की जाती थी। मुझे लगता है कि मेरे उपयोग के मामले अभी थोड़ा अलग हैं।

+5

मेरा आंत जवाब होगा क्योंकि 'शब्दकोश <टीकेई, टेलीमेंट>' को कभी भी एसटीएल 'मानचित्र ' को दोहराने के लिए डिज़ाइन नहीं किया गया था। –

+0

मुझे यकीन है कि यह नहीं था, लेकिन मैं सिर्फ उत्सुक हूं कि उन्होंने निर्दिष्ट कुंजी की अनुपस्थिति में समान व्यवहार करने के लिए इसे डिज़ाइन न करने का निर्णय क्यों लिया। – Dave

+0

मुझे लगता है कि आपने कुछ निर्देशों को गलत स्थान दिया है जो कि सेटटर के अंदर गेटटर पर होना चाहिए। –

उत्तर

10

यदि आप पहले से ही मानचित्र में मौजूद नहीं हैं तो आप किस मूल्य को वापस करना चाहते हैं? यह default(TValue) लौटा सकता है - लेकिन फिर यह गलती से मानने के लिए कुछ आसान होगा कि यह सही था। ध्यान दें कि यदि आपको लगता है कि व्यवहार चाहते हैं, आप उपयोग कर सकते हैं:

get { 
    string value; 
    if (!_mydic.TryGetValue(key, out value)) 
    value = default(string); 
    return value; 
} 

मैं व्यक्तिगत रूप से यह सामान्य रूप में की सिफारिश नहीं होगा, लेकिन अगर आप खुश हैं नहीं के साथ एक चाबी के बीच (इस इंडेक्सर के माध्यम से) भेद करने में सक्षम होने के लिए एक शून्य मूल्य और एक लापता कुंजी, यह चाल करेगा।

ध्यान रखें कि आपके सेटर मुझे बहुत आसान कर सकते हैं - बस

_mydic[key] = value; 

यदि आवश्यक हो तो ऊपर लिख देगा।

+0

जॉन, मैं थोड़ा उलझन में हूँ। मेरे पास सेटटर में उस तर्क का कारण है जो अपवाद के कारण है। तो मैं केवल उस सेटर कोड का उपयोग कर सकता हूं जिसे आपने निर्दिष्ट किया था यदि कुंजी पहले से मौजूद है ... सही? – Dave

+2

नहीं - [] सेटटर आवश्यकतानुसार जोड़ या ओवरराइट करेगा। –

+1

@ डेव: http://msdn.microsoft.com/en-us/library/9tee9ht2.aspx देखें। "यदि निर्दिष्ट कुंजी नहीं मिली है, तो एक ऑपरेशन एक KeyNotFoundException फेंकता है, और ** एक सेट ऑपरेशन निर्दिष्ट कुंजी ** के साथ एक नया तत्व बनाता है।" –

3

मैं मानता हूँ अपवाद हैंडलिंग तरह का कष्टप्रद है, विशेष रूप से संदर्भ प्रकार के लिए जब हो रही एक अशक्त आमतौर पर समझ में आता है। किसी भी मामले में हालांकि आप एक कॉल में मूल्य प्राप्त करने के लिए Dictionary<>.TryGetValue() का उपयोग कर सकते हैं।

+0

धन्यवाद, मैंने पहले कभी उस कॉल का उपयोग नहीं किया था। मैं इस पर गौर करूंगा! – Dave

0

मैं उलझन में हूं। यह यहाँ करता है। docs फिर भी कहते हैं:

When you set the property value, if the key is in the Dictionary(TKey, TValue), the value associated with that key is replaced by the assigned value. If the key is not in the Dictionary(TKey, TValue), the key and value are added to the dictionary. 

और

KeyNotFoundException: The property is retrieved and key does not exist in the collection. 

(इसके बारे में कोई जिक्र नहीं काम के दौरान फेंक दिया जा रहा है)।

+0

हाँ मैं मिश्रित हो गया, यह चारों ओर एक और तरीका था। मेरी पोस्ट को ठीक करने जा रहा है। – Dave

संबंधित मुद्दे