2008-10-31 13 views
15

वर्तमान में मैंशब्दकोशों ValueOrNull/ValueorDefault

var x = dict.ContainsKey(key) ? dict[key] : defaultValue 

उपयोग कर रहा हूँ मैं किसी तरह शब्दकोश [कुंजी] है पर लौटने nonexistant चाबी के लिए अशक्त करना चाहते हैं, तो मैं लिख सकता है कुछ की तरह

var x = dict[key] ?? defaultValue; 

यह भी linq प्रश्न आदि का हिस्सा बनता है इसलिए मैं एक लाइन समाधान पसंद करूंगा। एक विस्तार विधि के साथ

public abstract class MyHelper { 
    public static V GetValueOrDefault<K,V>(Dictionary<K,V> dic, K key) { 
     V ret; 
     bool found = dic.TryGetValue(key, out ret); 
     if (found) { return ret; } 
     return default(V); 
    } 
} 

var x = MyHelper.GetValueOrDefault(dic, key); 
+0

वर्तमान उत्तर सही हैं, और यह भी देखें [मेरा समान प्रश्न] (http://stackoverflow.com/questions/6214975), जो अधिक चर्चा है। हालांकि आपको 'dict.ContainsKey (कुंजी) से बचना चाहिए? dict [key] 'जैसा कि आप दो बार शब्दकोश को देख रहे हैं, एक बार' ContainsKey 'के लिए और फिर' [] 'अनुक्रमणिका के लिए। 'TryGetValue' बदसूरत और गैर-इनलाइन है, लेकिन यह एक ही ऑपरेशन है। – Keith

उत्तर

21

:

+4

I के अलावा कुछ और लौटा सकता है। डी एक ओवरलोड लोड करता है जो डिफ़ॉल्ट रूप से लौटाता है (वी) – Will

+4

सी # 4 में अब आप डिफ़ॉल्ट पैरामीटर वैकल्पिक बना सकते हैं: V defaultVal = default (V)। फिर यदि आप नहीं चाहते हैं तो आपको डिफॉल्ट में पास नहीं होना पड़ेगा - यदि मान नहीं मिला है, तो आपको V. – Tevin

+0

प्रकार के लिए डिफ़ॉल्ट मिलेगा @ टीविन क्या आप msdn/आलेख को लिंक प्रदान कर सकते हैं यह इस व्यवहार को दस्तावेज करता है? मैं .NET 4 से परिचित नहीं हूं, लेकिन .NET 3.5 में किसी संदर्भ प्रकार पर डिफ़ॉल्ट-ऑपरेटर शून्य मान देता है और मान प्रकार पर डिफ़ॉल्ट नो-Args कन्स्ट्रक्टर का उपयोग करके मान देता है। मुझे संदेह है कि यह बदल गया है? – toong

6

आप एक सहायक विधि का उपयोग कर सकते हैं

public static class MyHelper 
{ 
    public static V GetValueOrDefault<K, V>(this IDictionary<K, V> dic, 
              K key, 
              V defaultVal = default(V)) 
    { 
     V ret; 
     bool found = dic.TryGetValue(key, out ret); 
     if (found) { return ret; } 
     return defaultVal; 
    } 
    void Example() 
    { 
     var dict = new Dictionary<int, string>(); 
     dict.GetValueOrDefault(42, "default"); 
    } 
} 
+0

आप इसे एक विस्तार विधि भी कर सकते हैं, ताकि आप dict.alValueOrDefault (कुंजी) – stevemegson

+0

मैंने सोचा कि उसने पहले स्थान पर किया था ... अजीब बात यह है कि केवल अंतर ही 'यह' कीवर्ड होगा। – Will

+3

आप वास्तव में यह बिना शर्त बना सकते हैं - TryGetValue पर कॉल के बाद बस वापस लौटें। यह डिफ़ॉल्ट होगा (वी) यदि विधि गलत लौटाती है। –

0

नहीं है बस TryGetValue(key, out value) क्या आप के लिए देख रहे हैं? का हवाला देते हुए MSDN: "परम" समाधान, में है कि यह एक विस्तार पद्धति के रूप में कार्यान्वित किया जाता है,

When this method returns, contains the value associated with the specified key, if the key is found; otherwise, the default value for the type of the value parameter. This parameter is passed uninitialized. 

http://msdn.microsoft.com/en-us/library/bb347013(v=vs.90).aspx से

+0

मैं एक सिंगल-लाइन अभिव्यक्ति की तलाश में था। 'TryGetValue' के साथ समस्या यह है कि 1) यह एक बयान है। 2) इसे 'आउट' चर की पूर्ववर्ती घोषणा की आवश्यकता है। – Jimmy

4

यहाँ है IDictionary इंटरफ़ेस का उपयोग करता, एक वैकल्पिक डिफ़ॉल्ट मान प्रदान करता है, और संक्षेप में लिखा है।

public static TV GetValueOrDefault<TK, TV>(this IDictionary<TK, TV> dic, TK key, 
    TV defaultVal=default(TV)) 
{ 
    TV val; 
    return dic.TryGetValue(key, out val) 
     ? val 
     : defaultVal; 
} 
संबंधित मुद्दे