현재 나는이 (조언을 읽은 후 편집)이 있습니다불변의 일반 쌍 구조체에 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 실제로 이것에 대해 저를 경고) 첫 번째 및 두 번째는 참조 형식되지 않을 수 있지만 코드는 여전히 컴파일합니다. 내가 그들을 비교하기 전에 그들을 (1 차 및 2 차) 물체에 던져 넣어야합니까, 아니면 이것을 할 수있는 더 좋은 방법이 있습니까?
편집 : 가치와 참조 유형을 지원하는이 구조체를 원하는 주
편집 2 (클래스에 의해 제약, 즉 올바른 해결책이 아니다) : 으로 내가 노력하고있어에 달성하기 위해, 나는 이것이 사전에서 일하기를 바랍니다. 둘째, SRP는 지금 당장이 문제의 본질이 아니기 때문에 중요하지 않습니다. 나중에 언제든지 리팩토링 할 수 있습니다. 세 번째로, default (T)와 비교하는 것은 null과 비교하는 대신 작동하지 않습니다. 시도해보십시오.
모든 내장 값 유형을 수행 0 한 디폴트 값의 해시 코드로? – ilitirit
그것이 사실이 아니지만 그것을 보장하기를 원하지 않는다면 나는 놀랄 것입니다. – Joe
또한 기본값 (T) 및 기본값 (K)이 작동하지 않음 "T '및'T '유형에"적용 할 수 없음 == "" – ilitirit