이중 순서로 LINQ를 쉽게 사용할 수 있도록 재사용 가능한 DoubleEqualityComparer (사용자 지정 허용 오차 : "엡실론"생성자 매개 변수 사용)을 구현하고 있습니다. 예 :IEqualityComparer <double> 허용 오차가 있습니다. GetHashCode를 구현하는 방법?
bool myDoubleFound = doubles.Contains(myDouble, new DoubleEqualityComparer(epsilon: 0.01));
GetHashCode를 구현하는 올바른 방법은 무엇입니까?
public class DoubleEqualityComparer : IEqualityComparer<double>, IEqualityComparer<double?>
{
private readonly double epsilon;
public DoubleEqualityComparer(double epsilon)
{
if (epsilon < 0)
{
throw new ArgumentException("epsilon can't be negative", "epsilon");
}
this.epsilon = epsilon;
}
public bool Equals(double x, double y)
{
return System.Math.Abs(x - y) < this.epsilon;
}
public int GetHashCode(double obj)
{
// ?
}
}
PS : 나는 항상 같은 값을 반환 할 수 있습니다, 항상 같음에 대한 호출 (더블 더블) 방법을 강제로 (안 아주 (예 GetHashCode는 (더블 obj가) {0 반환}) 여기 코드는 performant, 나도 알아),하지만이 솔루션은 비교자를 사전에 사용할 때 문제가 발생한다는 것을 기억합니다 ...
과도 성을 위반하기 때문에이 작업을 수행하지 마십시오. 'a는 b와 같고 b는 c와 같지만'a는 c와 같지 않을 수도 있습니다. – Ani