2011-05-26 9 views
11

मैंने ऑब्जेक्ट्स का एक पूरा समूह लिखा है जो संग्रह के सभी हिस्सों हैं और जिन पर मुझे बहुत सारे प्रकार और खोज करने की आवश्यकता होगी। इन ऑब्जेक्ट्स में से अधिकांश पर मैंने Equals विधि, IEquatable और operator! और operator== को लागू और ओवरराइड किया है।सूची <T> सॉफ़्टवेयर IEquatable के बजाय तुलनात्मक <T> का उपयोग करता है, क्यों?

अब मैं ऊपर दिए गए ऑब्जेक्ट पर List<T>.Sort का उपयोग करना चाहता हूं और यह पता चला है कि मुझे कस्टम सॉर्टिंग करने के लिए IComparable लागू करने की आवश्यकता है।

सॉर्ट IComparable का उपयोग क्यों करता है और फिर मेरी सभी ऑब्जेक्ट्स में IEquatable होने का बिंदु क्या है?

इसके अलावा Object.Equal ओवरराइडिंग के साथ क्या करना है?

+1

विचार प्रयोग; आपके पास तीन पूर्णांक हैं, 'ए',' बी' और 'सी'; आप जानते हैं कि 'a == b',' a! = c' और 'b! = c' (जो सभी संयोजन उपलब्ध हैं)। अब: आरोही क्रम में 'a',' b' और 'c' डालें; पी –

उत्तर

14

यह संभवतः IEquatable<T> का उपयोग करने के लिए क्रमशः उपयोग नहीं कर सकता - यह जानकर कि दो चीजें बराबर हैं या नहीं, उन्हें रैंक करने में आपकी सहायता नहीं होती है। हालांकि, यह कस्टम तुलनात्मक ऑब्जेक्ट प्रदान करने के लिए IComparable<T> का उपयोग कर सकता है यदि आपके प्रकार इसे लागू करते हैं, या IComparer<T> (Comparer<T>.Default सहित)। कार्यात्मक शैली (Comparison<T>) भी सुविधाजनक है, तदर्थ कोड के बहुत सारे बिना छँटाई के लिए:

list.Sort((x,y) => string.Compare(x.Name, y.Name)); 

लेकिन अगर आप सिर्फ एक सरल क्रमसूचक तरह चाहते हैं, तो अपने T लागू IComparable<T>, और बस का उपयोग करें:

समानता के लिए
list.Sort(); 
4

क्योंकि IComparable यह निर्धारित करने की अनुमति देता है कि कोई ऑब्जेक्ट किसी अन्य ऑब्जेक्ट की तुलना में "छोटा" या "बड़ा" है, जबकि IEquatable यह पता लगाने में सहायता करता है कि दो ऑब्जेक्ट्स "बराबर" हैं या नहीं।

पूर्व को सॉर्ट करने के लिए आवश्यक है, क्योंकि सिर्फ यह जानने के लिए कि कौन सी वस्तुएं बराबर मान हैं, उन्हें आपको एक विशिष्ट क्रम में रखने में मदद नहीं करती है।

7

समानता केवल आपको परिणाम दे सकती है कि दो वस्तुएं बराबर हैं या नहीं। यह आपको नहीं बता सकता कि x क्रमबद्ध क्रम में y से पहले या उसके बाद आना चाहिए। केवल समानता को देखते हुए, आप कैसे प्रस्तावित करेंगे कि List<T> किसी भी सॉर्टिंग को निष्पादित करना चाहिए?

IEquatable<T> लागू करने का बिंदु यह है कि समानता जो महत्वपूर्ण है, उदा। HashSet<T> में या Dictionary<TKey, TValue> में कुंजी प्रकार के रूप में। इसी तरह, उनको का उपयोग करकेIComparable<T> का उपयोग करके कुशलतापूर्वक कार्यान्वित नहीं किया जा सका, क्योंकि यह हैश कोड प्रदान नहीं करेगा।

दो इंटरफेस मूल रूप से विभिन्न परिस्थितियों में उपयोग किए जाते हैं।

4

क्योंकि सॉर्टिंग समानता पर निर्भर नहीं है लेकिन सापेक्ष रैंक पर निर्भर करता है। क्रमबद्ध करने के लिए आपको एक-दूसरे के सापेक्ष वस्तुओं की स्थिति जानने की आवश्यकता है। ग्रेटर थान, कम से कम, बराबर।

0

ठीक है, आप the other questions about this topic में देख सकते हैं, IEquatable<T> चेक, जबकि IComparable<T> एक रैंक जो छँटाई के लिए आवश्यक है प्रस्तुत करता है।

0

IEquatable इंटरफ़ेस का उपयोग करके आप equivalence relation परिभाषित करते हैं, लेकिन सॉर्ट करने के लिए आपको ordering की आवश्यकता होती है।

0

समानता आपको बताती है कि क्या दो उदाहरण बराबर हैं। तुलनात्मकता आपको बताती है कि उन्हें कैसे क्रमबद्ध करें।

आप Object.Equals के इंस्टेंस संस्करण को ओवरराइड करते हैं जब आप रनटाइम से बेहतर जानते हैं कि आपके प्रकार के लिए समानता कैसे काम करती है।

संदर्भ प्रकारों के लिए समानता संदर्भ समानता के लिए डिफ़ॉल्ट है (समान संदर्भ एक ही वस्तु है)।

object o1 = new object(); 
object o2 = o1; 

if(o2==o1) 
{ 
    Console.WriteLine("These reference types are equal"); 
} 

object o3 = new object(); 

if(o2 != o3) 
{ 
    Console.WriteLine("These reference types are not equal"); 
} 

मूल्य प्रकारों के लिए डिफ़ॉल्ट समानता का अर्थ है कि सभी सदस्य चर बराबर हैं। आपको आम तौर पर मूल्य प्रकारों के लिए बराबर ओवरराइड करना चाहिए, क्योंकि आप शायद बेहतर तरीके से जानेंगे कि बराबर क्या मतलब है।

यह प्रभाव तुलनात्मकता कैसे है कि तुलनात्मकता कुछ हद तक समानता पर भरोसा करती है। यह जानने के लिए कि इसका अर्थ क्या है उससे कम या उससे अधिक होने का मतलब है कि इसका मतलब क्या है।