एक ही रास्ता तुम सच में ऐसा कर सकते हैं bool Object.Equals(object other)
ओवरराइड सच वापस जाने के लिए जब समानता आपकी शर्तों को पूरा कर रहे हैं, और नहीं तो झूठी वापस जाने के लिए है। तुम भी int Object.GetHashCode()
ओवरराइड किसी पूर्णांक डेटा है कि आप मानते हैं Equals()
अधिभावी के सभी से गणना की वापस जाने के लिए आवश्यक है।
एक तरफ के रूप में, ध्यान दें कि GetHashCode()
के लिए अनुबंध निर्दिष्ट करता है कि वापसी मूल्य दो वस्तुओं के बराबर होना चाहिए जब Equals()
उनकी तुलना करते समय सत्य वापस आ जाएगा। इसका मतलब है कि return 0;
GetHashCode()
का एक मान्य कार्यान्वयन है लेकिन यह अक्षमताओं के कारण होगा जब अपने वर्ग की वस्तुओं, एक HashSet<T>
में संग्रहीत शब्दकोश कुंजी के रूप में उपयोग किया जाता है या।
तरह से मैं समानता लागू इस तरह है:
public class Foo : IEquatable<Foo>
{
public bool Equals(Foo other)
{
if (other == null)
return false;
if (other == this)
return true; // Same object reference.
// Compare this to other and return true/false as appropriate.
}
public override bool Equals(Object other)
{
return Equals(other as Foo);
}
public override int GetHashCode()
{
// Compute and return hash code.
}
}
GetHashCode()
को लागू करने का एक आसान तरीका एक साथ डेटा आप Equals()
में समानता के लिए विचार के सभी के हैश कोड XOR है। तो अगर, उदाहरण के लिए, गुण आप समानता के लिए तुलना string FirstName; string LastName; int Id;
कर रहे हैं, अपने कार्यान्वयन लग सकता है जैसे:
public override int GetHashCode()
{
return (FirstName != null ? FirstName.GetHashCode() : 0)^
(LastName != null ? LastName.GetHashCode() : 0)^
Id; // Primitives of <= 4 bytes are their own hash codes
}
मैं आम तौर पर ओवरराइड नहीं कर समानता ऑपरेटरों, समय के सबसे अधिक के रूप में मैं समानता के साथ चिंतित हूँ केवल कुंजीपटल कुंजी या संग्रह के प्रयोजनों के लिए। मैं केवल समानता ऑपरेटरों को ओवरराइड करने पर विचार करता हूं यदि आप संदर्भ के मुकाबले मूल्य से अधिक तुलना करने की संभावना रखते हैं, क्योंकि यह वाक्य रचनात्मक रूप से कम वर्बोज़ है। हालांकि, अगर आप Object.ReferenceEquals()
उपयोग करने के लिए, या object
करने के लिए दोनों ऑपरेंड कास्ट करने के लिए सभी स्थानों पर जहां आप अपने वस्तु पर ==
या !=
का उपयोग बदलने के लिए याद करने के लिए है (Equals()
के अपने कार्यान्वयन में सहित!)। यह गंदा गॉचा (यदि आप सावधान नहीं हैं तो आपके समानता परीक्षण में अनंत रिकर्सन का कारण बन सकता है) प्राथमिक कारणों में से एक है कि मैं इन ऑपरेटरों को शायद ही कभी ओवरराइड करता हूं।
वस्तुओं के बराबर होने के लिए आपकी क्या शर्तें हैं? – BoltClock
मूल रूप से, इन स्ट्रिंग सदस्यों, डबल सदस्यों और सरणी में सभी मान समान होना चाहिए! – siva
http://stackoverflow.com/questions/506096/comparing-object-properties-in-c – RameshVel