2012-01-06 18 views
5

Dictionary की चाबियाँ समानता के साथ तुलनीय होने की आवश्यकता है?सी # शब्दकोश समानता आवश्यकता

उदाहरण

Class mytype 
{ 
    public bool equals(mytype other) 
    { 
     return ...; 
    } 
} 

मेरे मामले में वे बराबर जब तक कि वे एक ही उदाहरण हैं नहीं होगा के लिए

यदि मुझे समानता लागू करने की आवश्यकता है तो क्या मेरे पास एक बड़ा संख्यात्मक मान होना चाहिए जो mytype के हर नए उदाहरण के साथ बढ़ता है?

उत्तर

3

यदि आपकी कक्षाएं केवल equal हैं यदि वे एक ही उदाहरण हैं, तो आपको Dictionary में उनका उपयोग करने के लिए कुछ भी करने की आवश्यकता नहीं है। कक्षाएं (संदर्भ प्रकार) समान मानी जाती हैं यदि केवल वही वस्तु का संदर्भ लें।

From the documentation of GetHashCode

वस्तु के व्युत्पन्न वर्ग के लिए, GetHashCode विधि, Object.GetHashCode कार्यान्वयन सौंपा जा सकता है, अगर और केवल कि व्युत्पन्न वर्ग मूल्य समानता को परिभाषित करता है संदर्भ समानता होने के लिए और प्रकार एक मान प्रकार नहीं है अगर ।

जो आपके मामले में सच है। अंगूठे के नियम के रूप में, यदि आप बराबर ओवरराइड करते हैं तो आपको GetHashCode को ओवरराइड करने की आवश्यकता है, लेकिन यह आपके मामले में आवश्यक नहीं है क्योंकि डिफ़ॉल्ट रूप से आप जो खोज रहे हैं।

+0

धन्यवाद, एक अच्छा जवाब। – alan2here

1

डिफ़ॉल्ट रूप से, समानता उदाहरण पर आधारित होती है। दो अलग-अलग उदाहरण कभी बराबर नहीं होते हैं। आप केवल अपनी खुद की बराबर विधि प्रदान करके इसे बदल सकते हैं।

+1

आप 'GetHashCode() ' –

2

पर कोई प्रकार की कमी केवल अगर वे एक कुंजी के रूप में इस्तेमाल किया जा रहा है और आप वस्तु के ही उदाहरण के आधार पर तुल्यता नहीं करना चाहते हैं। यदि आप केवल सटीक समान उदाहरण के संदर्भों के बराबर होना चाहते हैं, तो आप ठीक हैं और कुछ भी करने की आवश्यकता नहीं है, लेकिन यदि आप अपने प्रकार को कुंजी के रूप में उपयोग कर रहे हैं, और आप "समकक्ष" उदाहरणों को बराबर मानना ​​चाहते हैं, तो आपकी कक्षा को Equals() लागू करना होगा और GetHashCode()

यदि आपका कस्टम प्रकार किसी मान के रूप में संग्रहीत किया जा रहा है, और कुंजी के रूप में उपयोग नहीं किया जाता है, तो यह आवश्यक नहीं है। उदाहरण के लिए, इस मामले में माईटाइप को Equals() या GetHashCode() ओवरराइड करने की आवश्यकता नहीं है क्योंकि इसे केवल मान के रूप में उपयोग किया जाता है, न कि स्टोरेज कुंजी के रूप में।

Dictionary<string, MyType> x; 

हालांकि इस मामले में:

Dictionary<MyType, string> x; 

आपका कस्टम प्रकार की कुंजी है, और इस प्रकार यह Equals() और GetHashCode() ओवरराइड करने के लिए की आवश्यकता होगी। GetHashCode() का उपयोग यह निर्धारित करने के लिए किया जाता है कि यह किस स्थान पर है, और Equals() हैश कोड (अन्य चीजों के साथ) पर टकराव को हल करने के लिए उपयोग किया जाता है।

कई LINQ प्रश्नों से निपटने के दौरान आपको उसी दो तरीकों को ओवरराइड करना होगा। वैकल्पिक रूप से, आप यह निर्धारित करने के लिए कि दो उदाहरण बराबर हैं, आप अपनी कक्षा के अलावा एक स्टैंडअलोन IEqualityComparer प्रदान कर सकते हैं।

+0

को भी कार्यान्वित करना चाहते हैं, लेकिन यदि संदर्भ समानता वांछित व्यवहार है, तो प्रकार इन तरीकों को ओवरराइड नहीं करना चाहिए, और ओपी इंगित करता है कि संदर्भ समानता * वांछित व्यवहार है। – phoog

+0

@phoog: अच्छा सवाल, उसका बयान "मेरे मामले में वे बराबर नहीं होंगे जब तक कि वे एक ही उदाहरण नहीं हैं" मेरे लिए "यह वही है जो" यह कर रहा है या "यही वह है जो मैं चाहता हूं करने के लिए ", मैंने किसी भी तरह से प्रतिबिंबित करने के लिए अपना जवाब अपडेट किया। –

0

EqualityComparer.Default<T> संपत्ति देखें।इस प्रकार शब्दकोष समानता तुलनाकर्ता प्राप्त करता है यदि आप इसे एक साथ आपूर्ति नहीं करते हैं।

यह एक समानता प्रकार टी

की & क्षमताओं उदाहरण के लिए, अगर टी IEquatable फैली हुई है, EqualityComparer.Default एक समानता comparer उदाहरण IEquatable इंटरफ़ेस का उपयोग करता है वापस आ जाएगी पर आधारित comparer देता है। अन्यथा यह एक समानता तुलनाकर्ता उदाहरण लौटाएगा जो ऑब्जेक्ट। एक्वाल्स विधि का उपयोग करता है।

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

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

* जब तक कि यह एक विचित्र मूल्य प्रकार न हो, जिसमें कच्चे बिट की तुलना की जाती है।

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