Wdrażam wielokrotnego użytku DoubleEqualityComparer (z niestandardową tolerancją: parametr konstruktora "epsilon"), aby ułatwić korzystanie z LINQ z sekwencjami podwójnymi. Na przykład:IEqualityComparer <double> z tolerancją; jak zaimplementować GetHashCode?
bool myDoubleFound = doubles.Contains(myDouble, new DoubleEqualityComparer(epsilon: 0.01));
Jaki jest właściwy sposób na wdrożenie GetHashCode? Oto kod:
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: zawsze mogę wrócić tą samą wartość (np GetHashCode (podwójne obj) {return 0;}) zawsze wymusić wywołanie equals (podwójne podwójne,) metoda (nie bardzo performant, wiem), ale pamiętam, że to rozwiązanie powoduje problemy, gdy porównywarka jest używana ze słownikiem ...
Nie powinieneś tego robić, ponieważ narusza przechodniość. Możliwe, że 'a równa się b' i' b równa się c', ale 'a nie równa się c'. – Ani