Могу ли я написать функцию хеш-кода для следующей логики сравнения?Можно ли написать функцию хеш-кода для сравнения, совпадающего со многими?
Два экземпляра My
равны, если совпадают по меньшей мере два свойства от (A, B, C).
Часть равных проста, но я нахожусь на части хеш-кода, и часть меня думает, что это будет невозможно.
class MyOtherComparer : IEqualityComparer<My>
{
public bool Equals(My x, My y)
{
if (Object.ReferenceEquals(x, y))
return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
int matches = 0;
if(x.A == y.A) matches++;
if(x.B == y.B) matches++;
if(x.C == y.C) matches++;
// match on two out of three
return (matches > 1)
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public int GetHashCode(My x)
{
// ???
}
}
UPDATE: В дополнении к правильному ответу Рида Copsey, очень важным момент о общей полезности нечеткого компаратора четко заявил Этан Браун - пожалуйста, смотрите его ответа, а также для полного понимания того, что лежит в основе этого Вопроса/ответа.
Я думаю, что ваша интуиция является правильной и что вы не можете надежно генерировать хэш-код, который стоит с нечетким сравнением. – zneak
Я бы посоветовал не трогать GetHashCode и Equals вообще в вашем случае и сделать метод FuzzyEquals. – SimpleVar
Каковы типы 'A',' B' и 'C'? Можем ли мы изменить формулы 'GetHashCodes'? – Servy