2012-01-27 14 views

Odpowiedz

17

Nie rozumiem, dlaczego go potrzebujesz. Jeśli chcesz utworzyć skrótu kodu na podstawie domyślnego GetHashCode dla 3 różnych przedmiotów, a potem po prostu użyć:

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

To będzie sprowadzają się do równowartości:

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

co jest dość rozsądne dla takiego połączenia ogólnego przeznaczenia.

Podobnie:

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

Czy sprowadzają się do równowartości numerem:

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

Ponownie, tak dobre, jak można się było spodziewać.

+1

+1: krotki i typy anonimowe doskonale nadają się do implementacji GetHashCode(), Equals() i ToString() – millimoose

+1

Przyjemny pomysł z użyciem klas 'Tuple' jako skrótu. Zauważ, że 'Tuple.Create (...). Equals (Tuple.Create (...))' nie jest równoznaczne z metodą "równa się" Guavy - to byłby po prostu 'object.Equals (x, y) '. – LukeH

+1

@LukeH, odkąd już to mamy, i mamy to również, to znaczy, że możemy zrobić lepiej niż Guava :) –

1

AFAIK brak. Jednak pisanie własne nie powinno być zbyt skomplikowane (nb, stosując odmianę skrótu Bernsteina):

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

Twoja metoda "równa się" jest dokładnie taka sama jak wbudowana metoda statyczna 'object.Equals (x, y)': http://msdn.microsoft.com/en-us/library/w4hkze5k.aspx – LukeH

+0

@LukeH Dzięki - dlaczego odświeżyć koło ?! Odpowiedź zaktualizowana. –

+0

'Równe' nie jest bardziej użyteczne niż odziedziczona standardowa implementacja. Musi być możliwe określenie, jakie dziedziny należy uwzględnić w odniesieniu do równości. – deamon

Powiązane problemy