आपको पहले से ही इसकी मूल परिभाषा मिल गई है कि वे क्या हैं । संक्षेप में, यदि आप को लागू IEquatable<T>
वर्ग पर T
, Equals
प्रकार का ऑब्जेक्ट पर विधि T
आपको बताता है कि वस्तु ही (एक समानता के लिए परीक्षण किया जा रहा) एक ही प्रकार का एक और उदाहरण के बराबर है T
। जबकि, आम तौर पर के उदाहरणों के दायरे के बाहर, IEqualityComparer<T>
किसी भी दो उदाहरणों की समानता का परीक्षण करने T
के लिए है T
।
जैसा कि वे किस लिए हैं, पहली बार में भ्रमित हो सकते हैं। परिभाषा से यह स्पष्ट होना चाहिए कि इसलिए IEquatable<T>
(कक्षा में T
ही परिभाषित ) अपनी वस्तुओं / उदाहरणों की विशिष्टता का प्रतिनिधित्व करने के लिए वास्तविक मानक होना चाहिए। HashSet<T>
, Dictionary<T, U>
(विचार GetHashCode
के रूप में अच्छी तरह से ओवरराइड की गई है), Contains
पर List<T>
इस बात का आदि बना उपयोग। को लागू करने IEqualityComparer<T>
पर T
ऊपर उल्लेख सामान्य मामलों में मदद नहीं करता। इसके बाद, इसके IEquatable<T>
अलावा किसी अन्य वर्ग पर लागू करने के लिए बहुत कम मूल्य है T
। यह:
class MyClass : IEquatable<T>
शायद ही कभी समझ में आता है।
दूसरी ओर
class T : IEquatable<T>
{
//override ==, !=, GetHashCode and non generic Equals as well
public bool Equals(T other)
{
//....
}
}
यह कैसे किया जाना चाहिए।
IEqualityComparer<T>
तब उपयोगी हो सकता है जब आपको समानता के एक कस्टम सत्यापन की आवश्यकता होती है, लेकिन सामान्य नियम के रूप में नहीं। उदाहरण के लिए, Person
कुछ बिंदु पर एक वर्ग में आपको उनकी उम्र के आधार पर दो लोगों की समानता का परीक्षण करने की आवश्यकता हो सकती है। उस मामले में आप यह कर सकते हैं:
class Person
{
public int Age;
}
class AgeEqualityTester : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.Age == y.Age;
}
public int GetHashCode(Person obj)
{
return obj.Age.GetHashCode;
}
}
उन्हें परखने के लिए, प्रयास करें
var people = new Person[] { new Person { age = 23 } };
Person p = new Person() { age = 23 };
print people.Contains(p); //false;
print people.Contains(p, new AgeEqualityTester()); //true
इसी IEqualityComparer<T>
पर T
मतलब नहीं है।
class Person : IEqualityComparer<Person>
यह सच है, काम करता है, लेकिन आँखों को अच्छा नहीं लगता और तर्क को हरा देता है।
आमतौर पर आपको जो चाहिए होता है IEquatable<T>
। आदर्श रूप से आपके पास केवल एक ही हो सकता है, IEquatable<T>
जबकि कई IEqualityComparer<T>
अलग-अलग मानदंडों के आधार पर संभव है।
IEqualityComparer<T>
और IEquatable<T>
वास्तव में के अनुरूप हैं Comparer<T>
और IComparable<T>
जो नहीं बल्कि equating से तुलना प्रयोजनों के लिए उपयोग किया जाता है; यहाँ एक अच्छा धागा जहाँ मैंने एक ही उत्तर लिखा है :)
EqualityComparer<T>
इंटरफ़ेस को लागू करने के बजाय इनहेरिट करने की भी सिफारिश करता है "क्योंकिEqualityComparer<T>
परीक्षण समानता का उपयोग करते हुएIEquatable<T>