2013-06-20 10 views
21

कोई तर्क के साथ HashSet निर्माता के लिए MSDN एपीआई में यह कहा गया हैसेट प्रकार के लिए डिफ़ॉल्ट समानता तुलनाकर्ता क्या है?

HashSet वर्ग कि खाली है और सेट प्रकार के लिए डिफ़ॉल्ट समानता comparer का उपयोग करता है का एक नया उदाहरण आरंभीकृत।

सेट प्रकार के लिए डिफ़ॉल्ट समानता तुलनाकर्ता क्या है, उदा। एक कस्टम वर्ग के लिए?

बीटीडब्लू: क्या यह सिर्फ मुझे है या एमएसडीएन एपीआई दस्तावेज वास्तव में स्पष्टीकरण पर थोड़ा पतला है? मैं इसे पढ़ने के बाद एक से अधिक बार इस तरह के प्रश्नों के बारे में ठोकर खाई।

उत्तर

29

इसका मतलब है कि यह सेट के T तत्व प्रकार T के लिए EqualityComparer<T>.Default द्वारा लौटा गया तुलनाकर्ता का उपयोग करेगा।

प्रलेखन राज्यों के रूप में:

डिफ़ॉल्ट संपत्ति चेकों प्रकार टी System.IEquatable इंटरफ़ेस लागू करता है कि क्या और, यदि हां, एक EqualityComparer कि कार्यान्वयन का उपयोग करता है देता है। अन्यथा, यह एक EqualityComparer Object.Equals और Object.GetHashCode टी

अपने कस्टम प्रकार के लिए

तो द्वारा प्रदान की ओवरराइड का उपयोग करता है देता है, यह GetHashCode विधि का उपयोग करेगा आप में आइटम का पता लगाने का परिभाषित किया है सेट। यदि आपने IEquatable<T> लागू किया है तो यह समानता के लिए IEquatable<T>.Equals(T) का उपयोग करेगा, अन्यथा यह आपके Equals(object) विधि का उपयोग करेगा। यह विधि object कक्षा में परिभाषित समानता को संदर्भित करने के लिए डिफ़ॉल्ट है। इसलिए यदि आप किसी भी विधि का उपयोग करके समानता को परिभाषित कर रहे हैं, तो आपको यह सुनिश्चित करना चाहिए कि आप GetHashCode को ओवरराइड भी करें।

+3

बस एक टिप्पणी का प्रयोग करेंगे। 'EqualityComparer । डिफॉल्ट 'खराब हो जाएगा (और इसलिए' हैशसेट 'खराब हो जाएगा) यदि' कस्टम क्लास '' Iquatable '*** *** के बिना' GetHashCode() 'ओवरराइड किए बिना लागू करता है। –

+0

@JeppeStigNielsen - हाँ आप सही हैं, मैं बस इसके बारे में अधिक जानकारी जोड़ रहा था। – Lee

+0

@JeppeStigNielsen यह एक अच्छा मुद्दा है जिसे मैंने अभी लिखा एक छोटे से उदाहरण में ठोकर खाई। 'IEquatable 'लागू क्यों नहीं कर रहा है? ली के जवाब में बयान में कहा गया है कि अगर पहले 'आईक्वेटेबल' लागू किया गया है, और यदि नहीं, तो 'ऑब्जेक्ट। एक्वाल्स' और 'ऑब्जेक्ट। गेटहाशकोड' का उपयोग किया जाएगा। –

4

डिफ़ॉल्ट रूप से, यह EqualityComparer<T>.Default पर प्रतिनिधि होगा। यह एक तुलनाकर्ता देता है जो T प्रकार की दो वस्तुओं की तुलना कर सकता है।

  • अगर वर्ग IEquatable<T> लागू करता है, यह अगर वर्ग एक Equals विधि है इस इंटरफेस
  • के वर्ग के कार्यान्वयन को सौंप देगा:

    एक कस्टम वर्ग के लिए, यह इस क्रम में कुछ बातें करता है परिभाषित, इसका इस्तेमाल करेगा कि

  • एक अंतिम उपाय के रूप में, यह संदर्भ समानता
संबंधित मुद्दे