目前我有這個(閱讀意見後編輯):如何在不可變的泛型Pair結構上實現IEqualityComparer?
struct Pair<T, K> : IEqualityComparer<Pair<T, K>>
{
readonly private T _first;
readonly private K _second;
public Pair(T first, K second)
{
_first = first;
_second = second;
}
public T First { get { return _first; } }
public K Second { get { return _second; } }
#region IEqualityComparer<Pair<T,K>> Members
public bool Equals(Pair<T, K> x, Pair<T, K> y)
{
return x.GetHashCode(x) == y.GetHashCode(y);
}
public int GetHashCode(Pair<T, K> obj)
{
int hashCode = obj.First == null ? 0 : obj._first.GetHashCode();
hashCode ^= obj.Second == null ? 0 : obj._second.GetHashCode();
return hashCode;
}
#endregion
public override int GetHashCode()
{
return this.GetHashCode(this);
}
public override bool Equals(object obj)
{
return (obj != null) &&
(obj is Pair<T, K>) &&
this.Equals(this, (Pair<T, K>) obj);
}
}
的問題是,第一,第二可能不是引用類型(VS實際上提醒我這件事),但代碼仍然編譯。在比較它們之前,我是否應該將它們(第一和第二)投射到物體上,還是有更好的方法來做到這一點?
編輯: 請注意,我想這結構,支持值類型和引用類型(換句話說,按類限制是不是一個有效的解決方案)
編輯2: 至於什麼我想要實現,我希望這個工作在一個詞典。其次,SRP對我來說現在並不重要,因爲這不是這個問題的實質 - 它總是可以在以後重構。第三,與默認值(T)相比,不會比較null值 - 嘗試它。
是否所有內置值類型已經0的哈希碼默認值嗎? – ilitirit 2008-09-23 13:13:22
如果不是這種情況,我會很驚訝,但不想保證。 – Joe 2008-09-23 13:31:49