शब्दकोश में तत्वों का क्रम


107

मेरा प्रश्न शब्दकोश तत्वों की गणना करने के बारे में है

// Dictionary definition
private Dictionary<string, string> _Dictionary = new Dictionary<string, string>();

// add values using add

_Dictionary.Add("orange", "1");
_Dictionary.Add("apple", "4");
_Dictionary.Add("cucumber", "6");

// add values using []

_Dictionary["banana"] = 7;
_Dictionary["pineapple"] = 7;

// Now lets see how elements are returned by IEnumerator
foreach (KeyValuePair<string, string> kvp in _Dictionary)
{
  Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value));
}

किस क्रम में तत्वों की गणना की जाएगी? क्या मैं आदेश को वर्णमाला के लिए मजबूर कर सकता हूं?


जवाबों:


125

एक शब्दकोश में तत्वों का क्रम गैर-नियतात्मक है। आदेश की धारणा बस हैशटेबल्स के लिए परिभाषित नहीं है। तो उसी क्रम में गणना करने पर भरोसा मत करो जैसे तत्वों को शब्दकोश में जोड़ा गया था। इसकी गारंटी नहीं है।

डॉक्टर से उद्धरण :

गणना के प्रयोजनों के लिए, शब्दकोश में प्रत्येक आइटम को KeyValuePair<TKey, TValue>एक मूल्य और इसकी कुंजी का प्रतिनिधित्व करने वाली संरचना के रूप में माना जाता है । जिस क्रम में आइटम वापस किए जाते हैं वह अपरिभाषित होता है।



28

यदि आप तत्वों को ऑर्डर करना चाहते हैं, तो एक ऑर्डरडाउन का उपयोग करें । भंडारण लेआउट के कुछ अर्थों में केवल एक सामान्य जल्दबाजी / शब्दकोश का आदेश दिया जाता है।


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

2
प्रश्न वर्णानुक्रम में आदेश देने के बारे में पूछ रहा है (मानकर प्रश्नकर्ता कुंजी के बारे में बात कर रहा है)। एक आदेशित शब्दकोश, अगर मैं दस्तावेज़ीकरण को सही ढंग से समझता हूं, तो वे उन तत्वों को थूक देंगे, जिन्हें वे सम्मिलित किए गए हैं, अर्थात वर्णानुक्रम में नहीं, बल्कि आंतरिक सूचकांक का उपयोग करते हुए। उपयोगकर्ता के प्रश्न के लिए एक क्रमबद्धता शायद सबसे उपयुक्त है।
मटमैला

28

आप हमेशा उसके लिए उपयोग कर सकते हैं SortedDictionary। ध्यान दें कि डिक्शनरी कुंजी द्वारा डिफ़ॉल्ट रूप से ऑर्डर की जाती है, जब तक कि एक तुलनित्र निर्दिष्ट नहीं किया गया हो।

मुझे लगता है OrderedDictionaryकि प्रलेखन के बाद से आप जो चाहते हैं, उसके उपयोग को लेकर मैं संशय में हूं :

एक क्रमबद्धता के तत्वों को क्रमबद्धता वर्ग के तत्वों के विपरीत, कुंजी द्वारा क्रमबद्ध नहीं किया जाता है।


यह ध्यान रखना महत्वपूर्ण है कि SortedDictionary<K,V>बाइनरी सर्च ट्री के रूप में कार्यान्वित किया जाता है, जो हैशटेबल-आधारित की तुलना में इसके संचालन को अलग-अलग समय और अंतरिक्ष जटिलता देता है Dictionary<K,V>। यदि उपयोगकर्ताओं को O(1)हैशटेबल संरचना डालने / हटाने की आवश्यकता होती है और यह कुंजी-क्रम में तत्वों पर पुनरावृति करना चाहते हैं, तो उन्हें dict.Keys.OrderBy( k => k ).Select( k => dict[k] )( O(n)अंतरिक्ष और O( n log n )समय की लागत पर ) इसके लिए चाहिए OrderBy()(जिसे आंतरिक सूची में संपूर्ण कुंजी संग्रह को बफर करना होगा )।
दाई

12

आइटमों को उसी क्रम में लौटाया जाएगा, जो उन्हें डिक्शनरी में भौतिक रूप से संग्रहीत करने के लिए होता है, जो हैश कोड पर निर्भर करता है और आइटमों को जोड़ने का क्रम होता है। इस प्रकार आदेश यादृच्छिक प्रतीत होगा, और जैसा कि कार्यान्वयन में परिवर्तन होता है, आपको कभी भी समान रहने वाले आदेश पर निर्भर नहीं होना चाहिए।

जब आप उन्हें एनुमरेट कर रहे हैं तो आप आइटम ऑर्डर कर सकते हैं:

foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) {
  ...
}

ढाँचे में 2.0 आपको क्रमबद्ध करने के लिए पहले आइटम को सूची में रखना होगा:

List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(_Dictionary);
items.Sort(delegate(KeyValuePair<string, string> x, KeyValuePair<string, string> y) { return x.Value.CompareTo(y.Value); });
foreach (KeyValuePair<string,string> kvp in items) {
  ...
}

11

एक आदेश के लिए:

 var _OrderedDictionary = new System.Collections.Specialized.OrderedDictionary();

_OrderedDictionary.Add("testKey1", "testValue1");
_OrderedDictionary.Add("testKey2", "testValue2");
_OrderedDictionary.Add("testKey3", "testValue3");

var k = _OrderedDictionary.Keys.GetEnumerator();
var v = _OrderedDictionary.Values.GetEnumerator();

while (k.MoveNext() && v.MoveNext()) {
    var key = k.Current; var value = v.Current;
}

आइटम उस क्रम में लौटाए जाते हैं जो उन्हें जोड़ा जाता है।


5

साहचर्य सरणियाँ (उर्फ, हैश टेबल) अनियंत्रित हैं, जिसका अर्थ है कि तत्वों को किसी भी तरह से कल्पना करने का आदेश दिया जा सकता है।

फिर भी, आप सरणी कुंजियाँ (केवल कुंजियाँ) प्राप्त कर सकते हैं, क्रमबद्ध रूप से वर्णानुक्रम में (एक प्रकार्य फ़ंक्शन के माध्यम से) और फिर उस पर काम कर सकते हैं।

मैं आपको एक C # नमूना नहीं दे सकता क्योंकि मैं भाषा नहीं जानता, लेकिन आपके लिए खुद पर जाने के लिए यह पर्याप्त होना चाहिए।

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