बस यह स्पष्ट करना: शब्दकोश निर्धारित करने के लिए दो चाबियाँ बराबर अर्थात हैं <TKey>
कस्टम प्रकार आप GetHashCode()
ध्यान से लागू करने के बारे ध्यान देना चाहिए की है GetHashCode का उपयोग करता है: वहाँ एक महत्वपूर्ण बात के बारे Dictionary<TKey, TValue>
और GetHashCode()
है। जैसा कि एंड्रयू हारे ने बताया कि यह आसान है, अगर आपके पास एक साधारण प्रकार है जो आपके कस्टम ऑब्जेक्ट को स्पष्ट रूप से पहचानता है। यदि आपके पास संयुक्त पहचानकर्ता है, तो यह थोड़ा और जटिल हो जाता है।
उदाहरण के रूप में TKey
के रूप में एक जटिल संख्या पर विचार करें। एक जटिल संख्या इसके वास्तविक और इसके काल्पनिक भाग द्वारा निर्धारित की जाती है। दोनों सरल प्रकार के हैं उदा। double
। लेकिन यदि आप दो जटिल संख्या बराबर हैं तो आप कैसे पहचानेंगे? आप अपने कस्टम कॉम्प्लेक्स प्रकार के लिए GetHashode()
लागू करते हैं और पहचानने वाले दोनों भागों को गठबंधन करते हैं।
आपको बाद वाले here पर और पढ़ने के लिए मिलता है।
अद्यतन
Ergwun की टिप्पणी मैं Equals(object)
और GetHashCode()
की TKey
के कार्यान्वयन के लिए विशेष सम्मान के साथ Dictionary<TKey, TValue>.Add
के व्यवहार की जाँच के आधार पर। मैं को यह स्वीकार करना होगा कि मैं परिणामों से आश्चर्यचकित था।
को देखते हुए दो वस्तुओं k1
और प्रकार TKey
की k2
, दो मनमाना वस्तुओं v1
और प्रकार TValue
की v2
, और प्रकार Dictionary<TKey, TValue>
के एक खाली शब्दकोश d
, इस जब कुंजी के साथ d
पहली और v2
की कुंजी k1
साथ v1
जोड़ने क्या होता है
k1.Equals(k2) k1.GetHashCode() == k2.GetHashCode() d.Add(k2, v2)
false false ok
false true ok
true false ok
true true System.ArgumentException
कोन: k2
दूसरा (TKey.Equals(object)
के कार्यान्वयन और TKey.GetHashCode()
के आधार पर) भ्रम: मैं गलत था क्योंकि मैंने मूल रूप से दूसरा मामला सोचा था (जहां Equals
false
देता है लेकिन दोनों प्रमुख वस्तुओं में एक ही हैश कोड है) ArgumentException
उठाएगा। लेकिन चूंकि तीसरा मामला किसी भी तरह से शब्दकोश दिखाता है GetHashCode()
का उपयोग करता है। वैसे भी यह अच्छी सलाह प्रतीत होती है कि दो ऑब्जेक्ट्स जो एक ही प्रकार के हैं और बराबर हैं, उन्हें यह सुनिश्चित करने के लिए एक ही हैश कोड वापस करना होगा कि उदाहरण Dictionary<TKey, TValue>
सही तरीके से काम करते हैं।
स्रोत
2009-09-10 20:21:29
संभावित डुप्लिकेट [बराबर विधि ओवरराइड होने पर GetHashCode को ओवरराइड करना क्यों महत्वपूर्ण है?] (Http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when- बराबर-विधि-ओवर-ऑर्डर) – nawfal