यहां कोई भी जवाब वास्तव में मेरे लिए जगह नहीं मारा। चूंकि आपने पहले ही कहा है कि आप समानता के लिए Id
का उपयोग नहीं कर सकते हैं, और आपको गुणों के बंडल का उपयोग करने की आवश्यकता है, यह करने का एक बेहतर तरीका यहां है। नोट: मैं इसे Equals
और GetHashCode
को लागू करने का सबसे अच्छा तरीका मानता हूं। यह ओपी के कोड का एक बेहतर संस्करण है।
public override bool Equals(object obj)
{
var myClass = obj as MyClass;
if (null != myClass)
{
// Order these by the most different first.
// That is, whatever value is most selective, and the fewest
// instances have the same value, put that first.
return this.Id == myClass.Id
&& this.Name == myClass.Name
&& this.Quantity == myClass.Quantity
&& this.Color == myClass.Color;
}
else
{
// Not sure this makes sense!
return base.Equals(obj);
}
}
public override int GetHashCode()
{
int hash = 19;
unchecked { // allow "wrap around" in the int
hash = hash * 31 + this.Id; // assuming integer
hash = hash * 31 + this.Name.GetHashCode();
hash = hash * 31 + this.Quantity; // again assuming integer
hash = hash * 31 + this.Color.GetHashCode();
}
return hash;
}
इस के पीछे तर्क से कुछ के लिए this answer by Jon Skeet देखें। Xor का उपयोग करना अच्छा नहीं है क्योंकि डेटा के विभिन्न सेट समाप्त हो सकते हैं जिसके परिणामस्वरूप एक ही हैश होता है। प्राइम के साथ इस लपेटने वाली विधि (ऊपर 1 9 और 31 के बीज मूल्य, या आपके द्वारा चुने गए अन्य मूल्य) "बाल्टी" में विभाजित करने का बेहतर काम करते हैं जिनमें प्रत्येक टकराव होते हैं।
यदि आपके कोई भी मूल्य शून्य हो सकता है, तो मैं आपको सावधानी से सोचने के लिए प्रोत्साहित करता हूं कि उन्हें तुलना कैसे की जानी चाहिए। आप शॉर्ट सर्किट नल मूल्यांकन और नल कोलेसिंग ऑपरेटर का उपयोग कर सकते हैं। लेकिन सुनिश्चित करें कि अगर नल की तुलना बराबर की तुलना में की जानी चाहिए कि आप अलग-अलग हैश कोड को विभिन्न शून्य गुणों को असाइन करते हैं जब वे शून्य होते हैं।
इसके अलावा, मुझे विश्वास है आपके Equals
कार्यान्वयन किसी भी समझ में आता है कि नहीं कर रहा हूँ। जब समानता के लिए दो वस्तुओं की तुलना की जाती है, तो पहले उनके GetHashCode
मानों की तुलना की जाती है। केवल अगर वे अलग हैं Equals
विधि रन (ताकि यदि दो वस्तुओं को एक ही मान के लिए हैश अलग हैं, तो यह पता लगाया जाएगा)।चूंकि आपका GetHashCode
कार्यान्वयन base
का संदर्भ नहीं देता है, इसलिए ऐसा करने के लिए आपके Equals
विधि का कोई अर्थ नहीं है।
संबंधित: http://stackoverflow.com/questions/2326288/implementing-ddd-entity-class-in-c –
आप अपने बराबर में ही निर्धारक के रूप में GetHashCode के परिणामों का प्रयोग नहीं कर सकते हैं - हैश कोड हो सकता है वही वस्तुएं अलग होती हैं। आप अपने आईडी को बराबर में तुलना करने से बेहतर होगा। इस पर और अधिक के लिए, देखें [सी # में बराबर विधि ओवरराइड होने पर GetHashCode को ओवरराइड करना क्यों महत्वपूर्ण है?] (Http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode- जब-बराबर-विधि-है-ओवर्रिडेन-इन-सी) –
आपको यह ध्यान में रखना चाहिए कि GetHashCode() को कोड में अधिकतर उपयोग किया जाता है जहां प्रदर्शन महत्वपूर्ण है (ओ (1) लुकअप आदि के साथ सूचियां)। आपका कार्यान्वयन पहले से ही धीमा है, लेकिन आप इसे बिना किसी बदलाव के पहले से तेज कर सकते हैं: 'वापसी ("MyClass" + this.Id) .GetHashCode();' (केवल कुछ जो आप GetHashCode के साथ ध्यान में रखना चाहते हैं) – Aidiakapi