Существует ли встроенный IEqualityComparer, который сравнивает объекты, используя только их хэш-значение?
-
21-09-2019 - |
Вопрос
Существует ли встроенный IEqualityComparer, который сравнивает объекты по значению, возвращаемому их значением GetHashCode?Это легко написать, но я бы предпочел использовать предоставленный класс вместо пользовательского.
Текущий код:
private class HashComparer : IEqualityComparer<TKey>
{
private readonly Func<TKey, int> _Hasher;
public HashComparer (Func<TKey, int> hasher)
{
_Hasher = hasher;
}
public bool Equals (TKey x, TKey y)
{
// null supposed to throw, therefore no check
return _Hasher (x) == _Hasher (y);
}
public int GetHashCode (TKey obj)
{
return _Hasher (obj);
}
}
Решение
Нет, насколько мне известно, такой вещи в фреймворке не существует.
Это было бы вообще плохо - хэш-коды не обязательно должны быть уникальными, поэтому их нельзя было бы использовать для имитации обычного равенства, кроме как для типов с 2 ^ 32 возможными значениями или меньше, и алгоритма генерации хэша, который выдает уникальный код для каждого значения.
Я изо всех сил пытаюсь придумать какое-либо разумное применение для этого - вот почему вы вряд ли найдете это в фреймворке.Возможно, там есть какие-то очень специализированная ситуация, когда вы сочли бы это полезным, но этого недостаточно для того, чтобы включить это в основную структуру.
Из интереса, что вы пытаетесь с этим сделать?