Будучи несколько ленивым в реализации множества компараторов 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?