दोनों इंटरफेस समानता के लिए वस्तुओं की तुलना करते हैं, इसलिए उनके बीच प्रमुख अंतर क्या है?
दोनों इंटरफेस समानता के लिए वस्तुओं की तुलना करते हैं, इसलिए उनके बीच प्रमुख अंतर क्या है?
जवाबों:
IEquatable<T>
समानता के लिए।
IComparable<T>
आदेश देने के लिए।
ग्रेग डी के जवाब के अलावा:
आप उस वर्ग के लिए लागू IComparable
किए बिना लागू कर सकते हैं IEquatable
जहां एक आंशिक आदेश समझ में आता है, और जहाँ आप निश्चित रूप से चाहते हैं कि उपभोक्ता केवल इस वजह से अनुमान लगा सकेCompareTo()
शून्य लौटता है, इसका मतलब यह नहीं है कि ऑब्जेक्ट समान हैं (सॉर्टिंग उद्देश्यों के अलावा किसी भी चीज के लिए)।
IComparable
यहां पूरी तरह से अनुचित है। आपको जो मिला है, वह एक विशेष ऑर्डर है जो केवल एक विशेष स्थिति में लागू होता है। ऐसी स्थितियों के लिए, एक सामान्य लागू IComparable
करना गलत है। यह वही है जो IComparer
वहाँ के लिए हैं। उदाहरण के लिए, लोगों को सार्थक रूप से आदेश नहीं दिया जा सकता है। लेकिन उन्हें उनके वेतन, उनके जूते के आकार, उनके झाई की संख्या या उनके वजन के अनुसार आदेश दिया जा सकता है। इसलिए, हम IComparer
इन सभी मामलों के लिए अलग-अलग लागू करेंगे ।
जैसा कि IEDN से MSDN पेज पर कहा गया है :
IComparable इंटरफ़ेस
CompareTo
विधि को परिभाषित करता है , जो कार्यान्वयन प्रकार के उदाहरणों के क्रम को निर्धारित करता है। IEquatable इंटरफ़ेसEquals
विधि को परिभाषित करता है , जो कार्यान्वयन प्रकार के उदाहरणों की समानता को निर्धारित करता है।
Equals
बनाम CompareTo
IComparable <T>
एक विशिष्ट प्रकार की तुलना विधि को परिभाषित करता है जिसका उपयोग वस्तुओं को क्रम या क्रमबद्ध करने के लिए किया जा सकता है।
IEquatable <T>
एक सामान्यीकृत विधि को परिभाषित करता है जिसका उपयोग समानता को निर्धारित करने के लिए लागू करने के लिए किया जा सकता है।
मान लीजिए कि आपके पास व्यक्ति वर्ग है
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person p1 = new Person() { Name = "Person 1", Age = 34 };
Person p2 = new Person() { Name = "Person 2", Age = 31 };
Person p3 = new Person() { Name = "Person 3", Age = 33 };
Person p4 = new Person() { Name = "Person 4", Age = 26 };
List<Person> people = new List<Person> { p1, p2, p3, p4 };
people.Sort();
।लेकिन यह एक अपवाद को फेंक देगा।
फ्रेमवर्क इन वस्तुओं को क्रमबद्ध करना नहीं जानता है। आपको यह बताने की आवश्यकता है कि कार्यान्वयन IComparable
इंटरफ़ेस को कैसे सॉर्ट करना है।
public class Person : IComparable
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(object obj)
{
Person otherPerson = obj as Person;
if (otherPerson == null)
{
throw new ArgumentNullException();
}
else
{
return Age.CompareTo(otherPerson.Age);
}
}
}
यह सरणी को Sort()
विधि के साथ ठीक से सॉर्ट करेगा ।
Equals()
विधि का उपयोग कर सकते हैं ।var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
यह वापस आ जाएगाfalse
क्योंकि Equals
विधि को दो वस्तुओं की तुलना करने का तरीका नहीं पता है। इसलिए आपको IEquatable
इंटरफ़ेस को लागू करने और रूपरेखा को बताने की आवश्यकता है कि तुलना कैसे करें। पिछले उदाहरण पर विस्तार से यह इस तरह दिखेगा।
public class Person : IComparable, IEquatable<Person>
{
//Some code hidden
public bool Equals(Person other)
{
if (Age == other.Age && Name == other.Name)
{
return true;
}
else
{
return false;
}
}
}
IEquatable
जेनेरिक का उपयोग क्यों करता है <Person>
और IComparable
नहीं करता है?
IComparable
ठीक से लागू करने की तुलना में । आप एक सार्थक उदाहरण है, जहां के साथ आ सकते हैंCompareTo(…) == 0
करता नहीं समानता का मतलब? मैं निश्चित रूप से नहीं कर सकता। वास्तव में, इंटरफ़ेस अनुबंध (MSDN के अनुसार) के लिए आवश्यक है किCompareTo(…) == 0
समानता का अर्थ है। इसे कुंद करने के लिए, आपके जैसे एक मामले में, एक विशेषComparator
वस्तु का उपयोग करें , लागू न करेंIComparable
।