2011-02-10 10 views
7

मेरे पास Dictionary डेटा प्रकार है। मेरा सवाल है, Dictionary.Keys.ToList()[i] हमेशा Dictionary.Values.ToList()[i] से मेल खाता है? यही कारण है, होगा निम्न परीक्षण हमेशा गुजरताशब्दकोश करता है .Keys.List() [i] शब्दकोश से मेल खाता है। Values.ToList() [i]?

public void DictionaryTest(int i, Dictionary<U,T> dict) 
{ 
    var key = dict.Keys.ToList()[i]; 
    Assert.AreEqual(dict[key], dict.Values.ToList()[i]); 
} 

उत्तर

1

Dictionary.Keys Property के लिए MSDN प्रविष्टि जाँच हो रही है:

Dictionary.KeyCollection में चाबियों का आदेश अनिर्दिष्ट है, लेकिन यह रूप में एक ही आदेश है शब्दकोश में संबंधित मूल्य। ValueCollection मूल्य संपत्ति द्वारा लौटाया।

+0

क्या यह कहना सही है कि SortedDictionary ने चाबियों पर ऑर्डर निर्दिष्ट किया है? –

+0

@ रेचेंग मैंने उद्धृत दस्तावेज 'डिक्शनरी' वर्ग को संदर्भित किया है। अपने प्रश्न का उत्तर देने के लिए, आपको 'SortedDictionary.Keys' के लिए प्रलेखन की जांच करने की आवश्यकता है, जो कहता है "' SortedDictionary 'में कुंजी' TKey, TValue> .KeyCollection' को 'तुलनाकर्ता' संपत्ति के अनुसार क्रमबद्ध किया गया है और उसी क्रम में हैं 'SortedDictionary । ValueCollection' में संबंधित मानों के रूप में 'मानों' गुण द्वारा लौटाया गया है।" तो आपके प्रश्न का उत्तर * हां * है। – CodesInChaos

6

मैं MSDN से इस आधार पर हाँ कहने होगा:

Dictionary.ValueCollection में मानों का क्रम अनिर्दिष्ट है, लेकिन यह Dictionary.KeyCollection में जुड़े कुंजी के रूप में एक ही क्रम है कुंजी संपत्ति द्वारा लौटाया।

+1

+1: एमएसडीएन का उल्लेख करने के लिए पहले – Simon

0

आपके कोड में - हाँ। लेकिन यदि आप यू क्लास में GetHashCode() को ओवरराइड करते हैं और फिर कुछ बदलाव किए हैं जो GetHashCode() के मान को बदल देंगे और आवेषण का आह्वान करेंगे, तो यह संभव है कि यह गलत होगा, क्योंकि शब्दकोश को हैश तालिका के रूप में लागू किया गया है। अगले कोड झूठे रिटर्न:

class Program 
    { 
     static void Main(string[] args) 
     { 
      Dictionary<A, int> d = new Dictionary<A, int>(); 
      for (int i = 1; i <= 10; i++) 
      { 
       d.Add(new A { Hash = i}, i); 
      } 
      DictionaryTest(5, d); 
     } 

     public static void DictionaryTest(int i, Dictionary<A, int> dict) 
     { 
      A key = dict.Keys.ToList()[i]; 
      key.Hash = 4; 
      Console.WriteLine(dict[key].Equals(dict.Values.ToList()[i])); 
      Console.ReadKey(); 
     } 
    } 

    public class A 
    { 
     public int Hash { get; set; } 

     public override bool Equals(object obj) 
     { 
      return this.GetHashCode() == obj.GetHashCode(); 
     } 
     public override int GetHashCode() 
     { 
      return Hash; 
     } 
    } 
+1

यदि आप 'शब्दकोश' के अनुबंध का उल्लंघन करते हैं तो आपको अपरिभाषित व्यवहार मिलता है। अचंभा अचंभा। "जब तक ऑब्जेक्ट को शब्दकोश में एक कुंजी के रूप में प्रयोग किया जाता है , यह किसी भी तरह से नहीं बदला जाना चाहिए जो इसके हैश मान को प्रभावित करता है।" – CodesInChaos

+0

यह गलत नहीं होगा, क्योंकि प्रविष्टियों का क्रम अन्य होगा, लेकिन फिर से। –

+0

लेकिन यह संभव है और कुछ लोगों ने यह गलती की है। वे GetHashCode() विधि को ओवरराइड करते हैं और शब्दकोश के साथ ऑब्जेक्ट का उपयोग करते हैं। – Rover

0

परावर्तक का कहना है, कि फ्रेमवर्क 2.0 में - 4.0 दोनों KeyCollection और ValueCollection dictionary.entries संग्रह से अधिक की गणना कर रहे हैं। यही कारण है कि आदेश वही होगा। और उसी तरह से वही क्रम शब्दकोश (gVueuePairs) पर गणना करने के लिए होगा।

+0

यह महत्वपूर्ण है कि वर्तमान कार्यान्वयन न केवल यह करता है, लेकिन 'कुंजी' और 'मानों 'का अनुबंध इसकी गारंटी देता है। अन्यथा यह भविष्य के संस्करणों या विभिन्न कार्यान्वयन में अलग-अलग व्यवहार प्रदर्शित कर सकता है। – CodesInChaos

+0

ठीक है, भविष्य के संस्करणों में विनिर्देश भी बदल सकता है। मैंने अभी बताया कि यह अब कैसे कार्यान्वित किया गया और आदेश क्यों है। –

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