2011-10-13 10 views
6

ऑब्जेक्ट क्लास में 'समान' और 'गेटहाशकोड' विधि मौजूद है, और हमारे प्रकार ऑब्जेक्ट बेस क्लास का उत्तराधिकारी है। ऑब्जेक्ट के दो तरीकों को सीधे और आईसीओएमपेयर इंटरफेस का उपयोग करने के बीच क्या अंतर है?हमें IEqualityComparer, IEqualityComparer <T> इंटरफ़ेस की आवश्यकता क्यों है?

यदि हम ऑब्जेक्ट के समान और गेटहाशकोड को ओवरराइड करते हैं, और हैशटेबल पर धक्का देते हैं, तो यह ओवरिंग की बराबर विधि का उपयोग करेगा?

IEqualityComparer कन्स्ट्रक्टर के साथ नया हैशटेबल का क्या अंतर है?

उत्तर

14

IComparable इंटरफ़ेस जब आप करने के लिए "प्रकार" वस्तुओं में सक्षम होना चाहिए प्रयोग किया जाता है, और यह आप के लिए एक विधि (CompareTo) है कि आपको बताता है कि दो वस्तुओं < हैं, = या> देता है। IEqualityComparer का उपयोग करने वाला कन्स्ट्रक्टर आपको एक विशिष्ट Equals/GetHashCode देने देता है जो आपके ऑब्जेक्ट द्वारा परिभाषित किए गए विकल्पों से अलग हो सकता है। आम तौर पर Hashtable आपके ऑब्जेक्ट को Equals और GetHashCode (या आधार objectEquals और GetHashCode) का उपयोग करेगा।

एक उदाहरण के लिए, मानक स्ट्रिंग केस संवेदी तरह से तुलना ("A"! = "a"), लेकिन आप एक IEqualityComparer सहायक वर्ग एक मामला असंवेदनशील तरीके से अपने तार हैश करने के लिए सक्षम होने के लिए कर सकता है। (तकनीकी रूप से इस वर्ग के कई वेरिएंट में पहले से मौजूद है: वे StringComparer.InvariantCultureIgnoreCase को फोन किया और कर रहे हैं StringComparer के अन्य सभी स्थिर तरीकों कि एक StringComparer उद्देश्य यह है कि IComparer, IEqualityComparer, IComparer<string>, IEqualityComparer<string> लागू करता वापसी)

एक नोट के रूप में, Hashtable का उपयोग करता है IEqualityComparer वैकल्पिक पैरामीटर, सामान्य संस्करण IEqualityComparer<T> नहीं, क्योंकि Hashtable प्री-जेनरिक है।

1

IComparer इंटरफेस (जेनेरिक और गैर-जेनेरिक दोनों) आपको एक दूसरे के साथ दो उदाहरणों की तुलना करने की अनुमति देता है।

Compare विधि आपको किसी अन्य उदाहरण के साथ किसी ऑब्जेक्ट की तुलना करने की अनुमति देती है। ऑफकोर्स, जब वर्तमान इंस्टेंस शून्य है, तो आपको इस मामले में NullReferenceException मिलेगा, क्योंकि आप 'null' इंस्टेंस पर Compare पर कॉल करते हैं। IComparer लागू करने वाली कक्षा इस समस्या को दूर कर सकती है।

इसलिए, जब आप IComparer इंटरफ़ेस को लागू है, तो आप एक वर्ग जिसकी वजह से 'की तुलना' विधि, जो इस तरह कहा जा सकता है है होगा:

public class MyObjectComparer : IComparer<MyObject> 
{ 
    public int Compare(MyObject first, MyObject second) 
    { 
     // implement logic here to determine whether first is less, greater or equal then second. 
    } 
} 

यह आपको ऐसा करने के लिए अनुमति देता है:

var c = new MyObjectComparer(); 
var one = new MyObject(); 
var two = new MyObject(); 
c.Compare (one, two); 

जब आप निर्माता जहां IEqualityComparer उदाहरण निर्दिष्ट के साथ एक Hashtable का दृष्टांत, इसका मतलब है कि दिए गए IEqualityComparer निर्धारित करने के लिए एक निश्चित कुंजी पहले से Hashtable में मौजूद है कि क्या उपयोग किया जाएगा।
अन्यथा, कुंजी-ऑब्जेक्ट की तुलना विधि का उपयोग किया जाएगा।