Я реализую многоразовый компаратор DoubleEqualityComparer (с пользовательским допуском: параметр конструктора "epsilon"), чтобы облегчить использование LINQ с последовательностями double. Например:
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) (не очень производительный, я знаю ), но я помню, что это решение вызывает проблемы, когда компаратор используется со словарем...