IEqualityComparer с допуском; как реализовать GetHashCode?

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

7
задан Notoriousxl 29 June 2012 в 09:05
поделиться