Я реализую многоразовый DoubleEqualityComparer (с пользовательским допуском: параметр конструктора «epsilon»), чтобы облегчить использование 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 (двойной объект) {вернуться 0;}) всегда заставляют вызов Equals (двойной двойной,) метод (не очень я знаю), но я помню, что это решение вызывает проблемы, когда сравнение используется со словарем ...
Вы не должны этого делать, потому что это нарушает транзитивность. Возможно, что 'a равно b' и' b равно c', но 'a не равно c'. – Ani