डिक्शनरी डिक्शनरी बेस्ट प्रैक्टिस


79

मैं अभी हाल ही में देखा Dictionary.TryGetValue(TKey key, out TValue value)और उत्सुक था, जो शब्दकोश से एक मूल्य प्राप्त करने के लिए बेहतर दृष्टिकोण है।

मैंने पारंपरिक रूप से किया है:

if (myDict.Contains(someKey))
     someVal = myDict[someKey];
     ...

जब तक मैं जानता हूँ कि यह है वहाँ में किया जाना है।

क्या सिर्फ करना बेहतर है:

if (myDict.TryGetValue(somekey, out someVal)
    ...

कौन सा बेहतर अभ्यास है? क्या एक दूसरे से तेज है? मुझे लगता है कि कोशिश संस्करण अपने 'निगल' कोशिश के रूप में धीमी होगी / खुद के अंदर पकड़ और तर्क के रूप में उपयोग करते हुए, नहीं?

जवाबों:


84

TryGetValue थोड़ा तेज़ है, क्योंकि FindEntry को केवल एक बार कॉल किया जाएगा।

कितना तेज? यह हाथ में डेटासेट पर निर्भर करता है। जब आप Contains विधि कहते हैं, तो शब्दकोश इसके सूचकांक को खोजने के लिए एक आंतरिक खोज करता है। यदि यह सही है, तो वास्तविक मूल्य प्राप्त करने के लिए आपको एक और सूचकांक खोज की आवश्यकता है। जब आप TryGetValue का उपयोग करते हैं, तो यह केवल एक बार सूचकांक के लिए खोज करता है और यदि पाया जाता है, तो यह आपके चर के लिए मान प्रदान करता है।

FYI करें: यह वास्तव में एक त्रुटि नहीं पकड़ रहा है।

यह बुला रहा है:

public bool TryGetValue(TKey key, out TValue value)
{
    int index = this.FindEntry(key);
    if (index >= 0)
    {
        value = this.entries[index].value;
        return true;
    }
    value = default(TValue);
    return false;
}

ContainsKey यह है:

public bool ContainsKey(TKey key)
{
    return (this.FindEntry(key) >= 0);
}

TryGetValue थोड़ा तेज़ है, क्योंकि FindEntry को केवल एक बार कॉल किया जाएगा।
जो १0

1
जब आपके पास एक बड़ा शब्दकोश है, तो TryGetValue बहुत तेज़ है
Diadistis

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

29

वास्तव में TryGetValue तेजी से है। कितना तेज? यह हाथ में डेटासेट पर निर्भर करता है। जब आप Contains विधि कहते हैं, तो शब्दकोश इसके सूचकांक को खोजने के लिए एक आंतरिक खोज करता है। यदि यह सही है, तो वास्तविक मूल्य प्राप्त करने के लिए आपको एक और सूचकांक खोज की आवश्यकता है। जब आप TryGetValue का उपयोग करते हैं, तो यह केवल एक बार सूचकांक के लिए खोज करता है और यदि पाया जाता है, तो यह आपके चर के लिए मान प्रदान करता है।

संपादित करें:

ठीक है, मैं आपकी उलझन को समझता हूं इसलिए मुझे विस्तार से बताएं:

मामला एक:

if (myDict.Contains(someKey))
     someVal = myDict[someKey];

इस मामले में, FindEntry में 2 कॉल हैं, एक यह जांचने के लिए कि क्या कुंजी मौजूद है और एक इसे पुनः प्राप्त करने के लिए

केस 2:

myDict.TryGetValue(somekey, out someVal)

इस मामले में फाइंडकेई के लिए केवल एक कॉल है क्योंकि परिणामी सूचकांक उसी पद्धति में वास्तविक पुनर्प्राप्ति के लिए रखा गया है।


माना। TryGetValue कुंजी लुकअप को दो बार करने की आवश्यकता को समाप्त करता है। यह मल्टी-थ्रेडिंग के मामले में भी मदद कर सकता है। मान के मौजूद होने के समय की जाँच के बीच, यह जोड़ा या हटाया जा सकता है। इससे "कुंजी पहले से मौजूद है" या "कुंजी नहीं मिली" अपवाद हो सकते हैं।
ब्रायन रुडोल्फ

0

मुझे लगता है कि trygetvalue कुछ और कर रहा है जैसे:

if(myDict.ReallyOptimisedVersionofContains(someKey))
{ 
  someVal = myDict[someKey];
  return true;
}
return false;

इसलिए उम्मीद है कि कहीं भी कोई कोशिश / पकड़ नहीं होगी।

मुझे लगता है कि यह वास्तव में सुविधा का एक तरीका है। मैं आमतौर पर इसका उपयोग करता हूं क्योंकि यह कोड या दो की एक पंक्ति बचाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.