Будучи несколько ленивым в отношении реализации множества IEqualityComparers, и учитывая, что я не мог легко редактировать реализации классов сравниваемого объекта, я пошел к следующему, предназначенному для использования с методами расширения Distinct () и Except ().:
public class GenericEqualityComparer<T> : IEqualityComparer<T>
{
Func<T, T, bool> compareFunction;
Func<T, int> hashFunction;
public GenericEqualityComparer(Func<T, T, bool> compareFunction, Func<T, int> 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 возвращает одинаковое значение, вызывается функция равенства.(from: Почему важно переопределить GetHashCode, когда переопределен метод Equals? )
Так что может пойти не так, если, например, (и я слышу, как многие программисты кричат в ужасе), GetHashCode возвращает константу, чтобы вызвать вызов Equal?