2009-03-09 18 views
64

क्या किसी को पता है कि सिस्टम के बीच व्यावहारिक मतभेद क्या हैं। चयन। Specialized.StringDictionary ऑब्जेक्ट और System.Collections.Generic.Dictionary?स्ट्रिंग डिक्शनरी बनाम <स्ट्रिंग, स्ट्रिंग>

मैंने उन दोनों को बिना किसी विचार के इस्तेमाल किया है, जो बेहतर प्रदर्शन करेगा, लिंक के साथ बेहतर काम करेगा, या कोई अन्य लाभ प्रदान करेगा।

कोई विचार या सुझाव कि मुझे दूसरे पर एक का उपयोग क्यों करना चाहिए?

उत्तर

77

Dictionary<string, string> एक और आधुनिक दृष्टिकोण है। यह IEnumerable<T> लागू करता है और यह LINQy सामान के लिए अधिक उपयुक्त है।

StringDictionary पुराना स्कूल तरीका है। यह जेनेरिक दिनों से पहले था। मैं केवल विरासत कोड के साथ इंटरफेसिंग करते समय इसका उपयोग करूंगा।

+2

क्या दोनों के बीच कोई प्रदर्शन अंतर है? – thecoop

+0

आपको यह देखने के लिए बेंचमार्क करना चाहिए कि आपकी विशेष स्थिति के लिए कौन सा बेहतर प्रदर्शन करता है। मुझे एक उल्लेखनीय प्रदर्शन अंतर की उम्मीद नहीं है। मैं सभी नए कोड के लिए 'शब्दकोश <स्ट्रिंग, स्ट्रिंग>' का उपयोग करने की अनुशंसा करता हूं (जब तक आपको 1.1 को लक्षित करने की आवश्यकता न हो)। –

+1

@thecoop अब मेरे पक्ष से मौजूद कोई हार्ड डेटा नहीं है, लेकिन एक बार जब मैंने स्पीड 'स्ट्रिंग डिक्शनरी' के लिए परीक्षण किया था तो खराब प्रदर्शन किया गया था (हालांकि सभी जो अधिकतर बात नहीं करते हैं)। वास्तव में ईमानदार होने के लिए, पहले मुझे लगता था कि 'स्ट्रिंग डिक्शनरी' कुछ प्रकार का विशेष संग्रह था, जो 'स्ट्रिंग' कुंजी था, और मेरे परीक्षण में और भी खराब होने पर आश्चर्यचकित चीजों के लिए, और मैंने इसे केवल गोग किया सीखने के लिए यह nongeneric – nawfal

33

मुझे लगता है कि स्ट्रिंग डिक्शनरी बहुत अप्रचलित है। यह ढांचे के v1.1 (जेनेरिक से पहले) में अस्तित्व में था, इसलिए उस समय यह एक बेहतर संस्करण था (गैर-जेनेरिक शब्दकोश की तुलना में), लेकिन इस बिंदु पर, मुझे विश्वास नहीं है कि इसके लिए कोई विशिष्ट फायदे हैं शब्दकोश पर

हालांकि, स्ट्रिंग डिक्शनरी के नुकसान हैं। स्ट्रिंग डिक्शनरी आपके कुंजी मान स्वचालित रूप से कम करती है, और इसे नियंत्रित करने के लिए कोई विकल्प नहीं है।

देखें:

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/

+0

'स्ट्रिंग डिक्शनरी 'का उपयोग' Properites.Settings' में किया जा सकता है जबकि' शब्दकोश <स्ट्रिंग, स्ट्रिंग> 'नहीं हो सकता है। तो अप्रचलित या नहीं, अभी भी 'स्ट्रिंग डिक्शनरी' के लिए कुछ उपयोग है। – jahu

36

एक और मुद्दा।

इस अशक्त रिटर्न:

StringDictionary dic = new StringDictionary(); 
return dic["Hey"]; 

यह एक अपवाद फेंकता है:

Dictionary<string, string> dic = new Dictionary<string, string>(); 
return dic["Hey"]; 
+0

"अपवाद फेंकता है" * सुविधा * '\ <> 'का मतलब है कि मैं कभी भी '[]' का उपयोग नहीं कर सकता। स्ट्रिंग डिक्शनरी का उपयोग करें मेरे अधिकांश कोड को साफ़ कर दिया है। –

+0

@ जेम्स मुझे थोड़ी देर हो चुकी है लेकिन आपको शायद TryGetValue का उपयोग करना चाहिए। –

+0

@ ŞafakGür - I * do * TryGetValue() का उपयोग करें - क्योंकि मैं कभी भी '[] 'का उपयोग नहीं कर सकता क्योंकि यह अपवाद फेंकता है। (स्ट्रिंग डिक्शनरी केवल एक प्रकार के शब्दकोशों के लिए हल करता है) –

1

एक और अधिक "आधुनिक" वर्ग होने के अलावा, मैंने देखा कि शब्दकोश अधिक स्मृति StringDictionary से कुशल एक बड़े अंतर से है ।

+8

हम यहां कुछ संख्याओं का उपयोग कर सकते हैं – Zonko

29

रीड कॉपसी ने बताया कि स्ट्रिंग डिक्शनरी आपके प्रमुख मूल्यों को कम करता है। मेरे लिए यह कुल मिलाकर अप्रत्याशित था, और एक शो-स्टॉपर है।

private void testStringDictionary() 
{ 
    try 
    { 
     StringDictionary sd = new StringDictionary(); 
     sd.Add("Bob", "My name is Bob"); 
     sd.Add("joe", "My name is joe"); 
     sd.Add("bob", "My name is bob"); // << throws an exception because 
             // "bob" is already a key! 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

मैं इस जबाब जोड़ रहा इस विशाल अंतर है, जो IMO आधुनिक बनाम ओल्ड-स्कूल अंतर से ज्यादा महत्वपूर्ण है करने के लिए और अधिक ध्यान आकर्षित करने के लिए।

+2

यदि किसी कारण से किसी को शब्दकोश के साथ वही व्यवहार चाहिए <स्ट्रिंग, स्ट्रिंग> इसका उपयोग किया जा सकता है: शब्दकोश ht = new Dictionary (StringComparer.OrdinalIgnoreCase); एचटी। जोड़ें ("बॉब", "एफएफ"); एचटी। जोड़ें ("बॉब", "एफएफ"); // अपवाद फेंकता है – osexpert

2

StringDictionary .NET 1.1 से आता है और लागू करता IEnumerable

Dictionary<string, string> .NET 2.0 से आता है और लागू करता है IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

IgnoreCase केवल StringDictionary

Dictionary<string, string> में कुंजी के लिए सेट कर दिया जाता LINQ

के लिए अच्छा है
 Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
     dictionary.Add("ITEM-1", "VALUE-1"); 
     var item1 = dictionary["item-1"];  // throws KeyNotFoundException 
     var itemEmpty = dictionary["item-9"]; // throws KeyNotFoundException 

     StringDictionary stringDictionary = new StringDictionary(); 
     stringDictionary.Add("ITEM-1", "VALUE-1"); 
     var item1String = stringDictionary["item-1"];  //return "VALUE-1" 
     var itemEmptystring = stringDictionary["item-9"]; //return null 

     bool isKey = stringDictionary.ContainsValue("VALUE-1"); //return true 
     bool isValue = stringDictionary.ContainsValue("value-1"); //return false 
1

एक और प्रासंगिक Poi एनटी यह है (अगर मैं यहां गलत हूं तो मुझे सही करें) System.Collections.Generic.Dictionary एप्लिकेशन सेटिंग्स में उपयोग नहीं किया जा सकता है (Properties.Settings) जबकि System.Collections.Specialized.StringDictionary है।

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