私は再利用可能なDoubleEqualityComparer(カスタム許容値: "ε"コンストラクタパラメータ)を実装して、LINQの使用を簡単にして、doubleのシーケンスで実装しています。例: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;})は、常に等号のコール(二重、二重)を強制する方法(あまり私は知っている)、しかし、この解決策は、コンペアが辞書で使われるときに問題を引き起こすことを覚えています...
これは推移性に違反するため、これを行うべきではありません。 'aはbと等しく、bはcと同じですが、aはcと等しくない可能性があります。 – Ani