2013-06-30 13 views
6

वहाँ एक रास्ता एक प्रमुख के लिए एक मूल्य को खोजने के लिए एक बार Dictionary<string, int> कॉल करने के लिए है? अभी मैं दो कॉल कर रहा हूं।शब्दकोश ContainsKey और एक समारोह में मूल्य प्राप्त

if(_dictionary.ContainsKey("key") { 
int _value = _dictionary["key"]; 
} 

मैं इसे करना चाहते हैं पसंद है:

object _value = _dictionary["key"] 
//but this one is throwing exception if there is no such key 

मैं अशक्त चाहेगा अगर वहाँ ऐसी कोई कुंजी या एक कॉल के साथ मूल्य मिल सकता है?

उत्तर

9

आप TryGetValue

int value; 
bool exists = _dictionary.TryGetValue("key", out value); 

TryGetValue रिटर्न सही उपयोग कर सकते हैं अगर यह निर्दिष्ट कुंजी है, अन्यथा, झूठे।

+2

'TryGetValue' सच वापस आ जाएगी अगर शब्दकोश कि कुंजी के साथ एक तत्व निहित होगा, अन्यथा गलत। – Femaref

+0

क्या हुआ अगर वह की तरह एक मुख्य/मान जोड़े है { "कुंजी", 0}, और वह एक गैर-मौजूद कुँजी से मान प्राप्त करने के लिए पूर्णांक मूल्य उस मामले 'exists' हो जाएगा में 0. – terrybozzio

+0

@terrybozzio हो जाएगा की कोशिश करता है 'झूठा' –

1

यह शायद, यह क्या करना चाहिए अपने उद्देश्यों के लिए। आप की तरह सवाल में पूछा गया तो एक ही बार, अशक्त या मूल्य में सभी हो रही, एक वस्तु में:

object obj = _dictionary.ContainsKey("key") ? _dictionary["key"] as object : null; 

या ..

int? result = _dictionary.ContainsKey("key") ? _dictionary["key"] : (int?)null; 
+0

यह 'ओ (| कुंजी |)' है। हम बेहतर कर सकते हैं। – jason

+0

"कुंजी" स्ट्रिंग का एक उदाहरण है क्योंकि शब्दकोश में कुंजी नहीं है - चाबियाँ प्राप्त करें - – terrybozzio

+0

मैं इसे समझता हूं। लेकिन 'संख्यात्मक। वहाँ' सभी चाबियों पर एक रैखिक खोज करेगा। यही कारण है कि यह चाबियों की संख्या में रैखिक है। '| कुंजी |' द्वारा चाबियों की संख्या को नकारते हुए 'ओ (| कुंजी |)' देता है। – jason

7

चयनित जवाब सही। यह विचार वह है लागू करने के लिए उचित तरीके के साथ प्रदाता user2535489 के लिए है:

public static class DictionaryExtensions 
{ 
    public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue fallback = default(TValue)) 
    { 
     TValue result; 

     return dictionary.TryGetValue(key, out result) ? result : fallback; 
    } 
} 

तो साथ इस्तेमाल किया जा सकता कौन सा:

Dictionary<string, int> aDictionary; 
// Imagine this is not empty 
var value = aDictionary.GetValue("TheKey"); // Returns 0 if the key isn't present 
var valueFallback = aDictionary.GetValue("TheKey", 10); // Returns 10 if the key isn't present 
+0

अभी भी यह जानने का कोई मतलब नहीं है कि आपको शब्दकोश या फ़ॉलबैक से कोई मूल्य प्राप्त हो रहा है या नहीं। मुझे इस तरह 'TryGetValue' को लपेटने में कोई मूल्य नहीं दिख रहा है। – spender

+1

आप सही हैं। लेकिन उपयोगकर्ता को 'TryGetValue' का उपयोग करने का विकल्प होता है यदि उसे यह जानने की परवाह है कि कुंजी शब्दकोश में थी या नहीं।यह सिंटैक्टिक चीनी है अगर वह एक लाइनर की परवाह नहीं करता है और चाहता है। मैं व्यक्तिगत रूप से अपने प्रस्ताव का उपयोग नहीं करता क्योंकि मुझे लगता है कि मैं नियंत्रण खो देता हूं। यह पूरी तरह से चर्चा के लिए है। –

0

मुझे लगता है, आप कुछ इस तरह कर सकता है (या एक लिखने बहुत स्पष्ट विस्तार विधि)।

 object _value = _dictionary.ContainsKey(myString) ? _dictionary[myString] : (int?)null; 

मुझे यकीन है कि मैं, कि हालांकि का उपयोग कर विशेष रूप से खुशी होगी अशक्त और अपने "मिला" हालत के संयोजन से नहीं कर रहा हूँ मैं सोचा होगा तुम सिर्फ थोड़ा आगे एक अशक्त जांच करने के लिए समस्या स्थानांतरण रहे हैं रेखा के नीचे।

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