2012-01-27 35 views
5

tarihinde Guavaequals uygulamak için güzel yardımcıları sağlar için GetHashCode yardımcı yöntemler ve aşağıdaki örnekte olduğu gibi hashCode ile gösterir:Kütüphane Eşittir ve .NET

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

Microsoft .NET için benzer bir kütüphane var?

cevap

17

birini gerekiyordu neden görmüyorum. 3 farklı öğeler için varsayılan GetHashCode dayalı bir karma-kod oluşturmak istiyorsanız, o zaman sadece kullanın: güzel

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() 

Yani eşdeğer aşağı kaynatın edeceğiz Böyle genel amaçlı bir kombinasyon için makul. Aynı şekilde

:

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

arayarak eşdeğer aşağı kaynatın misiniz:

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))); 

Yine, beklenebileceğini yaklaşık olarak iyi.

+1

+1: tupl'lar ve anonim tipler GetHashCode(), Equals() ve ToString() – millimoose

+1

'u uygulamak için mükemmeldir. Tuple sınıflarını kısayol olarak kullanarak güzel bir fikir. Ancak, Tuple.Create (...). Equals (Tuple.Create (...)) 'ın Guava'nın“ equals ”yöntemine eşdeğer olmadığını unutmayın - bu sadece object.quals (x, y) olur '. – LukeH

+1

@LukeH, biz zaten buna sahibiz, ve bizde de var, bu da Guava'dan daha iyisini yapabileceğimiz anlamına geliyor :) –

1

AFAIK yok. Ancak, kendi yazma (Bernstein karma bir varyasyonu kullanılarak nb) çok karmaşık olmamalı:

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

"Equals" yönteminiz, yerleşik "object.Equals (x, y)" statik yöntemiyle tam olarak aynıdır: http://msdn.microsoft.com/en-us/library/w4hkze5k.aspx – LukeH

+0

@LukeH Teşekkürler - neden tekerlek yeniden icat ?! Cevap güncellendi. –

+0

'Equals', devralınan standart uygulamadan daha kullanışlı değildir. Eşitlik için hangi alanların dikkate alınması gerektiğini belirtmek mümkün olmalıdır. – deamon