मैंने अशक्त की जाँच करने की कोशिश की लेकिन संकलक ने चेतावनी दी कि यह स्थिति कभी नहीं होगी। मुझे क्या खोजना चाहिए?
मैंने अशक्त की जाँच करने की कोशिश की लेकिन संकलक ने चेतावनी दी कि यह स्थिति कभी नहीं होगी। मुझे क्या खोजना चाहिए?
जवाबों:
मान लें कि आप कुंजी अगर लाभ प्राप्त करना चाहते करता है अस्तित्व, उपयोग Dictionary<TKey, TValue>.TryGetValue:
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(का उपयोग करते हुए ContainsKeyऔर फिर अनुक्रमणिका कुंजी को दो बार देखती है, जो कि बहुत व्यर्थ है।)
ध्यान दें कि भले ही आप संदर्भ प्रकारों का उपयोग कर रहे थे , अशक्त के लिए जाँच से काम नहीं चलेगा - Dictionary<,>यदि आप अनुपलब्ध कुंजी का अनुरोध करते हैं, तो अशक्त वापस लौटने के बजाय, अनुक्रमणिका एक अपवाद फेंक देगी। (यह Dictionary<,>और के बीच एक बड़ा अंतर है Hashtable।)
ContainsKey, जो सच है, क्योंकि इसे मूल्य भी निकालना है। हालांकि यह दो लुकअप नहीं कर रहा है।
शब्दकोश ने KeyNotFoundइस घटना में एक अपवाद फेंका कि शब्दकोश में आपकी कुंजी नहीं है।
जैसा कि सुझाव दिया गया है, ContainsKeyउपयुक्त एहतियात है। TryGetValueभी प्रभावी है।
यह शब्दकोश को अधिक प्रभावी ढंग से शून्य के मूल्य को संग्रहीत करने की अनुमति देता है। इस तरह से व्यवहार किए बिना, [] ऑपरेटर से एक अशक्त परिणाम के लिए जाँच करना या तो एक शून्य मान या इनपुट कुंजी की गैर-मौजूदगी को इंगित करेगा जो अच्छा नहीं है।
यदि आप एक नया मान जोड़ने का प्रयास करने से पहले जांच कर रहे हैं, तो ContainsKeyविधि का उपयोग करें :
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
यदि आप जाँच रहे हैं कि मान मौजूद है, तो TryGetValueजॉन स्कीट के उत्तर में वर्णित विधि का उपयोग करें ।
GetValueElseAddविधियाँ भी होती हैं जो आप मूल्य (या a Func<TValue>) को सम्मिलित करने के लिए रिज़ॉल्यूशन को बचाने के लिए देते हैं यदि आप जोड़ने जा रहे हैं यदि इसके नहीं हैं। मुझे लगता है कि इस कारण से यह .NET .NETs में नहीं आया है क्योंकि ऐड रास्ता कम होने के कारण यदि आप इसे कैश स्टाइल में उपयोग कर रहे हैं]
TryGetValueबेहतर होगा, लेकिन अगर आप यह जांचना चाहते हैं कि डुप्लिकेट परिवर्धन से बचने के लिए शब्दकोश में कुंजी है या नहीं, तो मैं कहूंगा कि ContainsKeyबस उतना ही अच्छा है (यदि बेहतर नहीं है)।
मूल्य निकालने की कोशिश करने से पहले आपको Dictionary.CtaintainsKey (int key) की जांच करनी चाहिए।
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
TryGetValue। शुक्र है, मैं अब ऐसा करता हूं, इसलिए मुझे भविष्य में पता चल जाएगा। मैं इस उत्तर को अक्षुण्ण रखने जा रहा हूं, हालांकि 'चर्चा महान है।
TryGetValueएक लैम्ब्डा अभिव्यक्ति में उपयोग नहीं कर सकते । हालांकि इससे मुझे लगता है कि C # के लिए एक नया विस्तार एक catchऑपरेटर के समान nullऑपरेटर होगा।
एक सहायक वर्ग आसान है:
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
ContainsKey वह है जो आप खोज रहे हैं।
आपको शायद उपयोग करना चाहिए:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
आप अशक्त के लिए जाँच क्यों नहीं कर सकते इसका कारण यह है कि यहाँ कुंजी एक मूल्य प्रकार है।
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
यदि कुंजी शब्दकोश में मौजूद है, तो यह कुंजी का मान लौटाता है अन्यथा यह 0 देता है।
आशा है, यह कोड आपकी मदद करता है।
TryGetValueपर्याप्त है, valueइसके बजाय का उपयोग करेंresult
इस विशेष शब्दकोश को इनकैप्सुलेट करने के विकल्प पर विचार करें और उस कुंजी का मान लौटाने के लिए एक विधि प्रदान करें:
public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};
public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}
तब आप इस शब्दकोश के व्यवहार का प्रबंधन कर सकते हैं।
यहाँ उदाहरण के लिए: यदि शब्दकोश में कुंजी नहीं है, तो यह कुंजी है कि आप पैरामीटर से गुजरते हैं।