Generic IEqualityComparer и GetHashCode

Будучи несколько ленивым в реализации множества компараторов IEqualityComparers и учитывая, что я не мог легко редактировать реализации классов сравниваемого объекта, я выбрал следующее, предназначенное для использования с методами расширения Distinct () и Except (). :

public class GenericEqualityComparer : IEqualityComparer
{
    Func compareFunction;
    Func hashFunction;

    public GenericEqualityComparer(Func compareFunction, Func hashFunction)
    {
        this.compareFunction = compareFunction;
        this.hashFunction = hashFunction;
    }

    public bool Equals(T x, T y)
    {
        return compareFunction(x, y);
    }

    public int GetHashCode(T obj)
    {
        return hashFunction(obj);
    }
}

Выглядит неплохо, но ДЕЙСТВИТЕЛЬНО ли нужна хеш-функция каждый раз? Я понимаю, что хэш-код используется для размещения объектов в ведрах. Различные сегменты, объекты не равны, и равный не вызывается.

Если GetHashCode возвращает то же значение, вызывается equals. (от: Почему важно переопределить GetHashCode, когда переопределен метод Equals? )

Итак, что может пойти не так, если, например (а я слышу, как многие программисты кричат ​​от ужаса) GetHashCode возвращает константа, чтобы принудительно вызвать Equal? ​​

10
задан Community 23 May 2017 в 12:10
поделиться