दोनों इंटरफेस समानता के लिए वस्तुओं की तुलना करते हैं, इसलिए उनके बीच प्रमुख अंतर क्या है?
दोनों इंटरफेस समानता के लिए वस्तुओं की तुलना करते हैं, इसलिए उनके बीच प्रमुख अंतर क्या है?
जवाबों:
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।