2009-09-21 12 views
15

मैं समझता हूं कि एक शब्दकोश एक आदेशित संग्रह नहीं है और किसी को किसी शब्दकोश में सम्मिलन और पुनर्प्राप्ति के आदेश पर निर्भर नहीं होना चाहिए।क्या एक शब्दकोश का गणक <TKey, TValue> क्रम में महत्वपूर्ण मूल्य जोड़ों को वापस जोड़ दिया गया है?

बहरहाल, यह मैं क्या देखा है: एक डिक्शनरी के

  • जोड़ा गया 20 कुंजी मान जोड़े
  • एक foreach (KeyValuePair ...)

के आदेश करने से उन्हें पुन: प्राप्त पुनर्प्राप्ति उस क्रम के समान थी जिसमें उन्हें जोड़ा गया था। लगभग 16 प्रमुख मूल्य जोड़े के लिए परीक्षण किया गया।

क्या यह डिज़ाइन द्वारा है?

+0

संबंधित प्रश्न: http://stackoverflow.com/questions/657263/does-hashset-preserve-insertion-order –

उत्तर

26

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

यह इस पुन: पेश करने के लिए अपेक्षाकृत बारीकियों है, लेकिन मैं थोड़ी देर पहले for another question यह करने के लिए कामयाब रहे:

using System; 
using System.Collections.Generic; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     var dict = new Dictionary<int, int>();   
     dict.Add(0, 0); 
     dict.Add(1, 1); 
     dict.Add(2, 2); 
     dict.Remove(0); 
     dict.Add(10, 10); 

     foreach (var entry in dict) 
     { 
      Console.WriteLine(entry.Key); 
     } 
    } 
} 

परिणाम बताते हैं 10, 1, 2 के बजाय 1, 2, 10

नोट भले ही यह वर्तमान व्यवहार जैसा दिखता है, यदि आप कोई विलोपन नहीं करते हैं तो व्यवहार हमेशा सम्मिलन आदेश में तत्व उत्पन्न करेगा, इस बात की कोई गारंटी नहीं है कि भविष्य के कार्यान्वयन समान होंगे ... इसलिए प्रतिबंधित मामले में जहां आप जानते हैं कुछ भी नहीं हटाएगा, कृपया इस पर भरोसा न करें।

+4

+1 - इस उदाहरण ने मुझे अपने परिदृश्य में व्यवहार को पुन: पेश करने में मदद की ताकि मैं इसे क्रिया में "देख सकूं", संभावित नुकसान से बचने में मेरी सहायता कर रहा हूं। – AdaTheDev

21

MSDN से:

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

[जोर जोड़ा]

0

मुझे नहीं लगता कि ऐसा है, शब्दकोश इसके अंदर वस्तुओं की आंतरिक आदेश जागीरदार नहीं करता है। यदि आपको ऑर्डर रखने की आवश्यकता है, तो शब्दकोश के साथ अतिरिक्त डेटा संरचना (सरणी या सूची) का उपयोग करें।

0

मुझे विश्वास है कि Dictionary<K,V> की गणना करने के लिए चाबियाँ उसी क्रम में वापस लौट जाएंगी, यदि सभी चाबियाँ एक ही मान पर हैं। ऐसा इसलिए है क्योंकि Dictionary<K,V> कार्यान्वयन कुंजी/मूल्य जोड़े को बाल्टी में डालने के लिए कुंजी ऑब्जेक्ट के हैश कोड का उपयोग करता है, और मान (आमतौर पर) बाल्टी में संग्रहीत क्रम में संग्रहीत होते हैं। यदि आप लगातार अपने उपयोगकर्ता द्वारा परिभाषित वस्तुओं के साथ इस व्यवहार को देख रहे हैं, तो शायद आपने GetHashCode() विधि को ओवरराइड नहीं किया है?

2

यह डिज़ाइन द्वारा है कि Dictionary<TKey,TValue> एक आदेशित संरचना नहीं है क्योंकि इसका मुख्य रूप से कुंजी-आधारित पहुंच के लिए उपयोग किया जाना है।

आप एक विशेष क्रम में आइटम को पुनः प्राप्त करने की जरूरत है, तो आप Sorted Dictionary<TKey, TValue> पर एक नज़र है, जो एक Comparer<T> कि Sorted Dictionary<TKey, TValue> में चाबियाँ सॉर्ट करने के लिए उपयोग किया जाएगा लेता लेना चाहिए।

+0

मुझे लगता है कि आपने प्रश्न को गलत तरीके से पढ़ा होगा। वह पूछ रहा है कि क्या वह परिणाम * परिणामों को क्रम में देख रहा है या नहीं। –

+0

धन्यवाद जॉन, मेरा मतलब यह था कि शब्दकोश एक आदेशित संरचना नहीं है डिजाइन द्वारा है। मैं अपने उत्तर को बेहतर ढंग से स्पष्ट कर दूंगा (यह ट्रेन पर एक आईफोन पर मुश्किल जवाब दे सकता है :)) –

+0

@ रूस: हाँ - मुझे एहसास हुआ कि आप क्या कह रहे थे, लेकिन यह "डिजाइन द्वारा डिजाइन" सवाल का जवाब नहीं दे रहा है :) –

3

आप की कोशिश कर सकते आप एक निश्चित क्रम में एक शब्दकोश के माध्यम से पुनरावृति करना चाहते हैं OrderedDictionary

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