再利用可能なDoubleEqualityComparer(カスタム許容値:「epsilon」コンストラクターパラメーターを使用)を実装して、doubleのシーケンスでのLINQの使用を容易にします。例えば:
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(double obj){return 0;})常にEquals(double、double)メソッドの呼び出しを強制します(あまりパフォーマンスが良くない、私は知っています)が、これを覚えています比較器を辞書で使用すると、解決策によって問題が発生します。