2011-12-15 11 views
5

यहां समानता तुलनाकर्ता है जो मैंने अभी लिखा है क्योंकि मैं इकाइयों वाली सूची से वस्तुओं का एक अलग सेट चाहता था।IEqualityComparer <T>/सूची <T> के बारे में प्रश्न। डिस्टिंक()

class InvoiceComparer : IEqualityComparer<Invoice> 
    { 
     public bool Equals(Invoice x, Invoice y) 
     { 
      // A 
      if (Object.ReferenceEquals(x, y)) return true; 

      // B 
      if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false; 

      // C 
      return x.TxnID == y.TxnID; 
     } 

     public int GetHashCode(Invoice obj) 
     { 
      if (Object.ReferenceEquals(obj, null)) return 0; 
      return obj.TxnID2.GetHashCode(); 
     } 
    } 
  1. क्यों Distinct के रूप में एक Func<T,T,bool> जाने के बजाय किसी comparer की आवश्यकता है?
  2. क्या (ए) और (बी) ऑप्टिमाइज़ेशन के अलावा कुछ भी हैं, और क्या वे परिदृश्य हैं, जब वे अपेक्षित तरीके से कार्य नहीं करेंगे, संदर्भों की तुलना में कमजोरी के कारण?
  3. अगर मैं करने के लिए, मैं

    return GetHashCode(x) == GetHashCode(y)

+0

यादृच्छिक आत्म agrandizing अवलोकन: यह एक अच्छा परीक्षा quetion –

उत्तर

4
  1. साथ (सी) की जगह सकता है तो यह hashcodes का उपयोग कर सकते हे (एन) होने के लिए के रूप में O (n करने का विरोध करना चाहता था)
  2. (ए) एक अनुकूलन है।
    (बी) आवश्यक है; अन्यथा, यह NullReferenceException फेंक देगा। यदि Invoice एक संरचना है, हालांकि, वे दोनों अनावश्यक हैं और धीमे हैं।
  3. सं Hashcodes अद्वितीय नहीं हैं
+0

मेरे मस्तिष्क काम नहीं कर रहा हो सकता है: मैंने सोचा मैं डॉक्स में पढ़ा है कि "बराबर वस्तुओं बराबर हैश कोड लौटाते हैं" ... –

+0

@Gabriel: असमान वस्तुओं भी _can_ बराबर हैशकोड वापस करें। – SLaks

1
  • A सुनिश्चित करने के लिए एक सरल और त्वरित तरीका है कि दोनों एक ही स्मृति पता तो दोनों संदर्भों को एक ही वस्तु पर स्थित वस्तुओं।
  • B - अगर संदर्भों में से एक रिक्त है - Obviuosly यह समानता तुलना
  • C कर किसी भी मतलब नहीं है - कोई, कभी कभी GetHashCode() विभिन्न वस्तुओं के लिए एक ही मूल्य (hash collision) लौट सकते हैं ताकि आप समानता तुलना
  • करना चाहिए
विभिन्न वस्तुओं के लिए एक ही हैश कोड मूल्य के बारे में

, MSDN:

दो वस्तुओं के रूप में बराबर की तुलना करें, प्रत्येक 01 के लिए GetHashCode विधिऑब्जेक्ट को वही मान वापस करना होगा। हालांकि, यदि दो ऑब्जेक्ट्स बराबर की तुलना नहीं करते हैं, तो दो ऑब्जेक्ट्स के लिए GetHashCode विधियां को अलग-अलग मानों को वापस नहीं करना है।

0

विशिष्ट() मूल रूप से "बराबर नहीं" शब्द पर काम करता है। इसलिए, यदि आपकी सूची में गैर-प्राइमिटिव प्रकार हैं, तो आपको अपना खुद का समानता कॉम्पैयर लागू करना होगा।

ए में, आप जांचते हैं कि ऑब्जेक्ट समान हैं या नहीं। यदि दो वस्तुएं बराबर होती हैं, तो उन्हें समान नहीं होना चाहिए, लेकिन यदि वे समान हैं, तो आप सुनिश्चित कर सकते हैं कि वे बराबर हैं। इसलिए कुछ भाग कुछ मामलों में विधि की प्रभावशीलता बढ़ा सकते हैं।

संबंधित मुद्दे