2010-01-27 13 views
9

अगर मैं एक है (संदर्भ - यह फर्क पड़ता है?) MyType जो हावी नहीं होता बराबर विधि टाइप करें, क्या heuristics का उपयोग किया जाएगा जब अगर एक ICollection <MyType> का निर्धारण में इस प्रकार का एक उदाहरण दिया गया है?ICollection <T> .Contains

अपने स्वयं के हेरिस्टिक का उपयोग करने का सबसे अच्छा तरीका क्या है (उदाहरण के लिए आईडी संपत्ति मूल्य की समानता के लिए जांच करें)?

+0

क्या विशिष्ट संग्रह आप उपयोग कर रहे लेता उपयोग करने के लिए है? –

+0

सिस्टम। चयन। ऑब्जेक्ट मॉडल।संग्रह Ben

उत्तर

7

क्योंकि आपका प्रकार बराबर ओवरराइड नहीं करता है, बराबर के डिफ़ॉल्ट कार्यान्वयन का उपयोग किया जाएगा, यानी संदर्भ समानता। इसलिए संग्रह में सत्य होगा यदि संग्रह में है जो बहुत ही उदाहरण है।

अपनी खुद की तुलना का उपयोग करने के लिए, IEqualityComparer<T> लागू करें (उदा। आईडी की तुलना करने के लिए) और अपने तुलनाकर्ता के उदाहरण विधि में एक उदाहरण पास करें। (यह मानता है कि आप LINQ एक्सटेंशन का उपयोग करने में सक्षम हैं, क्योंकि "मूल" ICollection<T>.Contains विधि में IEqualityComparer अधिभार नहीं है।)

+0

ब्याज से बाहर मूल्य प्रकार समान रूप से व्यवहार किए जाते हैं, और क्यों समानता विधि को ओवरराइड नहीं करते हैं? – Ben

+0

वैल्यू प्रकार बराबर मानते हैं यदि उनके सभी फ़ील्ड बराबर हैं। बेशक, आप एक संदर्भ प्रकार के समान मूल्य प्रकार पर बराबर ओवरराइड कर सकते हैं, और एक संदर्भ प्रकार के लिए एक वैल्यू प्रकार के लिए एक कस्टम IEqualityComparer लिख सकते हैं। – itowlson

1

यह ICollection<T> द्वारा परिभाषित नहीं है - विभिन्न कार्यान्वयन विभिन्न विधियों का उपयोग कर सकते हैं। MSDN से:

कार्यान्वयन भिन्न हो सकते हैं कि वे वस्तुओं की समानता निर्धारित करते हैं; उदाहरण के लिए, List<T> का उपयोग करता Comparer<T>.Default, जबकि Dictionary<TKey, TValue> उपयोगकर्ता IComparer<T> कार्यान्वयन कुंजी

ज्यादातर मामलों में यह सिर्फ संदर्भ की तुलना करेंगे की तुलना के लिए उपयोग करने के लिए निर्दिष्ट कर सकते हैं, लेकिन आप दस्तावेज़ देखने चाहिए विशिष्ट ICollection<T> के लिए आप उपयोग कर रहे हैं।

0

AFAIK, संदर्भ (स्मृति में पता) तुलना में किया जाएगा ...

संदर्भ काफी अच्छा आप तो आप आईडी की तुलना कर सकते हैं के लिए, जैसा कि आप उल्लेख किया है नहीं है।

0

MSDN के अनुसार:

क्रियान्वयन कि वे किस तरह की वस्तुओं की समानता का निर्धारण में भिन्न हो सकते हैं; उदाहरण, सूची < के लिए (के < (टी>)>) comparer < (के < (टी>)>) .. ::। डिफ़ॉल्ट, जबकि शब्दकोश < (का उपयोग करता < (TKey से TValue>)>) उपयोगकर्ता को आईसीओएमपेयर < (< (टी>)> कार्यान्वयन कुंजी की तुलना करने के लिए उपयोग करने के लिए कार्यान्वयन की अनुमति देता है।

अपने दम पर यह करने के लिए सबसे अच्छा तरीका है अधिभार है कि एक IEqualityComparer<T>

public class MyComparer : IEqualityComparer<MyType> 
{ 
    public bool Equals(MyType x, MyType y) 
    { 
     return x.Id == y.Id; 
    } 

    public int GetHashCode(MyType obj) 
    { 
     return obj.Id.GetHashCode(); 
    } 
} 
संबंधित मुद्दे