Я пытаюсь сравнить пользовательский тип в двух List<T>
и использовать метод Intersect
/Except
. Равенство определяется тремя полями этого типа. Равенство основано на более чем обычном условии (все поля содержат одинаковые данные). Я реализовал, конечно, IEqualityComparer<T>
. Моя проблема в том, что метод GetHashCode()
возвращает не равно, если хэш-код не совпадает, и это мне не помогает, поскольку в моем случае это неверно.
Есть ли способ сравнить два пользовательских объекта, когда равенство основано на более чем одном условии, поэтому я могу использовать пересечение/за исключением/отличных и т. д.?
Вот мой код:
public bool Equals(ComparableObject x, ComparableObject y)
{
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
if (Object.ReferenceEquals(x, y))
return true;
if (x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
return false;
if (x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
return true;
if (!x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
return false;
if (!x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3) && x.Var2.Equals(y.Var2))
return true;
if (x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && x.Var2.Equals(y.Var2))
return false;
if (!x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && x.Var2.Equals(y.Var2))
return false;
if (!x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
return false;
return x.Var1.Equals(y.Var1) && x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3);
}
public int GetHashCode(ComparableObject x)
{
return obj.Var1.GetHashCode() ^ obj.Var2.GetHashCode()^ obj.Var3.GetHashCode()
}
GetHashCode
реализацию. Или сказать вам, если методEquals
не работает, потому что он нарушает свой контракт. - person CodesInChaos   schedule 09.03.2012IEqualityComparer
выполняет работу в два прохода: сначала он собирает хеш-коды для всех объектов, а затем вызываетEquals
для пар, где хеш-код был одинаковым. Если бы вместо этого он выполнял наивное сравнение, это привело бы к 500 000 сравнений, если бы вы знали, какие пары объектов из 1000 объектов равны. - person GSerg   schedule 09.03.2012