जब आप एक शब्दकोश <T1, T2> के बजाय एक सूची <KeyValuePair <T1, T2 >> का उपयोग करेंगे?


95

इसी प्रकार के लिए KeyValuePair और एक शब्दकोश की सूची में क्या अंतर है? क्या एक या दूसरे का उपयोग करने के लिए एक उपयुक्त समय है?

जवाबों:


80

जब आपको कुंजी पर तेज लुकअप की आवश्यकता नहीं है - Dictionaryएक निश्चित ओवरहेड द्वारा उपयोग किए गए हैशटेबल को बनाए रखना है ।


9
इसके अलावा सूची डालने का कार्य तेजी से होता है कि डिक्शनरी में एक
Vadym Stetsiak

2
इसके क्षेत्र आसानी से पढ़े जाते हैं, लेकिन आप हमेशा सूची में पूरे तत्व को बदल सकते हैं।
पावेल मिनेव


62

संक्षेप में, सूची कुंजी की विशिष्टता को लागू नहीं करती है, इसलिए यदि आपको उस शब्दार्थ की आवश्यकता है तो आपको इसका उपयोग करना चाहिए।


7
+1 ध्यान दें कि शब्दकोश मूल्य की विशिष्टता को लागू नहीं करता है!
gdoron

25

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

इस उदाहरण पर विचार करें:

List<KeyValuePair<int, string>> pairs = new List<KeyValuePair<int, string>>();
pairs.Add(new KeyValuePair<int, string>(1, "Miroslav"));
pairs.Add(new KeyValuePair<int, string>(2, "Naomi"));
pairs.Add(new KeyValuePair<int, string>(2, "Ingrid"));

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "Miroslav");
dict.Add(2, "Naomi");
dict.Add(2, "Ingrid"); // System.ArgumentException: An item with the same key has already been added.

इसलिए आपको हमेशा दो कम से कम दो चीजों पर विचार करना चाहिए:

  1. क्या आप शब्दकोश में ठोस वस्तुओं को खोजना चाहते हैं?
  2. क्या आप कुछ फ़ील्ड्स को गैर-विशिष्ट बनाना चाहते हैं (उदाहरण के लिए जोड़े: firstname / lastname)।

1
मुझे लगता है कि यहाँ बिंदु कुंजी अद्वितीय होनी चाहिए जहाँ सूची <KeyValuePair> कुंजी अद्वितीय नहीं होनी चाहिए।
ब्रूनो बीरी

5
@BrunoBieri सूची <KeyValuePair> कुंजी अद्वितीय नहीं हो सकती
निखिल वर्तक

2
मैंने आपकी 2 साल पुरानी टिप्पणी को सुधार लिया, और आपने उस पर ध्यान दिया। कोई आश्चर्य नहीं कि क्यों SO एकमात्र विश्वसनीय और सबसे लोकप्रिय Q & A प्लेटफ़ॉर्म है।
निखिल वर्तक

14

जब आप वस्तुओं के क्रम की परवाह करेंगे तो सूची भी उपयोगी होगी।


2
क्या यह हल नहीं किया जाएगा?
एलेक्स एंगस

2
हां, लेकिन सॉर्टडाइडर केवल मानों के क्रम को कवर नहीं कर सकता, केवल चाबियाँ।
कन्फ्यूज्डमैन

7

फिलिप नगन के जवाब में, SOAP या अन्यथा, आप XML उन वस्तुओं को अनुक्रमित नहीं कर सकते हैं जो IDEDIA को लागू करती हैं।

प्रश्न: मैं हैशटेबल्स को अनुक्रमित क्यों नहीं कर सकता?

A: XmlSerializer ID एन्क्रिप्शन इंटरफ़ेस को लागू करने वाली कक्षाओं को संसाधित नहीं कर सकता है। यह आंशिक रूप से शेड्यूल बाधाओं के कारण था और आंशिक रूप से इस तथ्य के कारण कि एक हैशटेबल में एक्सएसडी टाइप प्रणाली में एक समकक्ष नहीं है। एकमात्र समाधान एक कस्टम हैशटेबल को लागू करना है जो IDEDIA इंटरफ़ेस को लागू नहीं करता है।

यहां से


5

चांदी के लिए SOAP webservices में, हमने पाया है कि डिक्शनरी धारावाहिक नहीं करती है। यह एक ऐसी स्थिति होगी जहां आप किसी शब्दकोश पर KeyValuePair की सूची का उपयोग करेंगे।


3

से http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :

KeyValuePairबनाम DictionaryEntry
[क्रिज़ीस्तोफ़ क्विना]

हम के कार्यान्वयन के साथ एक समस्या पर चर्चा IEnumerableपर Dictionary<K,V>। किस प्रकार IEnumerable.GetEnumerator().Current लौटना चाहिए ? KeyValuePair<K,V>या DictionaryEntry? उसी के लिए ICollection.CopyTo। सरणी के लिए किस प्रकार की प्रतिलिपि बनाई जानी चाहिए के उदाहरण?

हमने निम्नलिखित निर्णय लिया: IEnumerable और ICollectionइंटरफ़ेस कार्यान्वयन KeyValuePair<K,V>आइटम प्रकार के रूप में उपयोग करेगा । IDictionaryविशिष्ट सदस्य ( GetEnumeratorलौटने वाले IDictionaryEnumerator) DictionaryEntryआइटम प्रकार के रूप में उपयोग करेंगे।

कारण यह है कि हम एक बदलाव करने की प्रक्रिया में हैं जहां IEnumerator<T>विस्तार होगा IEnumerator। यह बहुत अजीब होगा अगर पदानुक्रम से चलना Dictionary<K,V>-> IEnumerable<T>-> - IEnumerable हमने अचानक एन्यूमरेटर से लौटे आइटम का प्रकार बदल दिया।

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