2012-01-27 13 views
5

गूगल Guavaequals लागू करने के लिए अच्छा सहायकों प्रदान करता है और hashCode निम्न उदाहरण की तरह साथ लाइब्रेरी को दर्शाता है:बराबर है और GetHashCode सहायक तरीकों के लिए नेट

public int hashCode() { 
    return Objects.hashCode(lastName, firstName, gender); 
} 

वहाँ Microsoft .NET के लिए एक समान पुस्तकालय है?

उत्तर

17

मैं नहीं दिख रहा है आपको इसकी आवश्यकता क्यों चाहते हैं। आप 3 अलग अलग मदों के लिए डिफ़ॉल्ट GetHashCode के आधार पर एक हैश-कोड बनाने के लिए चाहते हैं, तो बस का उपयोग करें:

int h1 = lastName.GetHashCode(); 
int h2 = firstName.GetHashCode(); 
int h3 = gender.GetHashCode(); 
return (((h1 << 5) + h1)^(((h2 << 5) + h2)^h3)); 

सुंदर है कौन सा:

Tuple.Create(lastName, firstName, gender).GetHashCode() 

कि के बराबर करने के लिए नीचे उबाल कर देंगे इस तरह के एक सामान्य उद्देश्य संयोजन के लिए उचित है।

इसी तरह

:

Tuple.Create(lastName, firstName, gender).Equals(Tuple.Create(lastName2, firstName2, gender2)) 

बुला के बराबर करने के लिए नीचे उबाल चाहेंगे:

return ((lastName == null && lastName2 == null) || (lastName != null && lastName.Equals(lastName2))) 
    && ((firstName == null && firstName2 == null) || (firstName != null && firstName.Equals(lastName2))) 
    && ((gender == null && gender2 == null) || (gender != null && gender.Equals(lastName2))); 

फिर से, के बारे में के रूप में अच्छा आप उम्मीद कर सकता है के रूप में।

+1

+1: GetHashCode(), Equals(), और ToString() – millimoose

+1

को लागू करने के लिए tuples और अनाम प्रकार बहुत अच्छे हैं शॉर्टकट के रूप में 'टुपल' कक्षाओं का उपयोग करके अच्छा विचार। लेकिन ध्यान दें कि 'Tuple.Create (...)। बराबर (Tuple.Create (...))' गुवा की 'बराबर' विधि के बराबर नहीं है - जो कि 'ऑब्जेक्ट' होगा। एक्वाल्स (x, y) '। – LukeH

+1

@LukeH, ठीक है क्योंकि हमारे पास पहले से ही है, और हमारे पास यह भी है, इसका मतलब है कि हम अमरूद से बेहतर कर सकते हैं :) –

1

AFAIK कोई नहीं। हालांकि, अपने खुद के लेखन बहुत जटिल (बर्नस्टीन हैश का एक परिवर्तन का उपयोग nb) नहीं होना चाहिए:

public static class Objects 
{ 
    public static bool Equals<T>(T item1, T item2, Func<T, IEnumerable<object>> selector) 
    { 
    if (object.ReferenceEquals(item1, item2) return true; 
    if (item1 == null || item2 == null) return false; 

    using (var iterator1 = selector(item1).GetEnumerator()) 
    using (var iterator2 = selector(item2).GetEnumerator()) 
    { 
     var moved1 = iterator1.MoveNext(); 
     var moved2 = iterator2.MoveNext(); 
     if (moved1 != moved2) return false; 
     if (moved1 && moved2) 
     { 
     if (!Equals(iterator1.Current, iterator2.Current)) return false; 
     } 
    } 
    return true; 
    } 

    public static bool Equals(object item1, object item2) 
    { 
    return object.Equals(item1, item2); 
    } 

    public static int GetHashCode(params object[] objects) 
    { 
    unchecked 
    { 
     int hash = 17; 
     foreach (var item in objects) 
     { 
     hash = hash * 31 + item.GetHashCode(); 
     } 
     return hash; 
    } 
    } 
} 
+0

आपकी 'समान 'विधि बिल्कुल अंतर्निहित' ऑब्जेक्ट के समान ही है। एक्वाल्स (एक्स, वाई)' स्थैतिक विधि: http://msdn.microsoft.com/en-us/library/w4hkze5k.aspx – LukeH

+0

@LukeH धन्यवाद - क्यों पहिया reinvent ?! उत्तर अपडेट किया गया। –

+0

'बराबर 'विरासत मानक कार्यान्वयन से अधिक उपयोगी नहीं है। यह कहना संभव होना चाहिए कि समानता के लिए किन क्षेत्रों पर विचार किया जाना चाहिए। – deamon