2011-04-30 160 views
2

我想使用自定義泛型類作爲字典中的鍵。我應該如何覆蓋EqualsGetHashCode如何使用自定義泛型類型作爲字典中的鍵?

例如,

public class SomeKey<T,V> 
{ 
    public T Value1 { get; set; } 
    public V Value2 { get; set; } 

    public SomeKey(T val1, V val2) 
    { 
     this.Value1 = val1; 
     this.Value2 = val2; 
    } 

    public override bool Equals(SomeKey<T,V> otherKey) 
    { 
     //whats the best option here? 
    } 

    public override int GetHashCode() 
    { 
     //whats the best option here? 
    } 
} 

由於

回答

5

平等是簡單的:測試Value1Value2是相等的。

對於散列碼,最簡單的方法是使用異或來合併來自Value1Value2的散列碼。

public override bool Equals(SomeKey<T,V> otherKey) 
{ 
    return Value1.Equals(otherKey.Value1) && Value2.Equals(otherKey.Value2); 
} 

public override int GetHashCode() 
{ 
    return Value1.GetHashCode()^Value2.GetHashCode(); 
} 

有很多替代方法計算哈希碼。如果性能是一個瓶頸,那麼你應該考慮一些比xor更適合的東西。

例如,堆棧溢出提供這些鏈接(還有更多):

+0

聽起來不錯。關心闡述或給出一個關於爲什麼xor是一個好主意的鏈接? – Nicolas78 2011-04-30 13:57:55

+0

那麼,對於散列碼來說,最好的選擇很大程度上取決於值的分佈。 xor是一種非常可靠,簡單的方法,如果您對值的分佈一無所知,您可以使用它。如果OP知道這樣的信息,那麼其他選擇可能是適當的。所有這些只在散列碼是性能瓶頸時才重要。 – 2011-04-30 14:03:05

+0

你介意添加一個代碼示例嗎?謝謝! – MalcomTucker 2011-04-30 14:03:24

1

你應該重寫它的方式,GetHashcode可靠地返回相同的值同一個對象,並且Equals總是爲相同的對象返回true。 msdn對實施GetHashcode(備註部分)有一些建議。

+0

你介意添加一個代碼示例嗎?謝謝! – MalcomTucker 2011-04-30 14:05:23

+0

大衛提供了一個很好的。 – Femaref 2011-04-30 14:49:31