La única forma en que puede hacer esto es anulando bool Object.Equals(object other)
para devolver verdadero cuando sus condiciones de igualdad se cumplen, y devuelva falso de lo contrario. También debe anular int Object.GetHashCode()
para devolver un int calculado a partir de todos de los datos que considere al anular Equals()
.
Como nota aparte, tenga en cuenta que el contrato para GetHashCode()
especifica que el valor de retorno debe ser igual para dos objetos cuando Equals()
devolvería verdadero al compararlos. Esto significa que return 0;
es una implementación válida de GetHashCode()
pero causará ineficiencias cuando los objetos de su clase se usan como claves de diccionario, o se almacenan en un HashSet<T>
.
La forma implemento la igualdad es la siguiente:
public class Foo : IEquatable<Foo>
{
public bool Equals(Foo other)
{
if (other == null)
return false;
if (other == this)
return true; // Same object reference.
// Compare this to other and return true/false as appropriate.
}
public override bool Equals(Object other)
{
return Equals(other as Foo);
}
public override int GetHashCode()
{
// Compute and return hash code.
}
}
Una forma sencilla de implementar GetHashCode()
es XOR juntos los códigos hash de todos los datos se tiene en cuenta la igualdad en Equals()
. Así que si, por ejemplo, las propiedades que Compárese, por la igualdad son string FirstName; string LastName; int Id;
, su aplicación podría ser:
public override int GetHashCode()
{
return (FirstName != null ? FirstName.GetHashCode() : 0)^
(LastName != null ? LastName.GetHashCode() : 0)^
Id; // Primitives of <= 4 bytes are their own hash codes
}
Me suelen No anulación de los operadores de igualdad, ya que la mayoría de las veces me preocupa la igualdad solo para propósitos de claves de diccionario o colecciones. Solo consideraría anular los operadores de igualdad si es probable que haga más comparaciones por valor que por referencia, ya que es sintácticamente menos detallado. Sin embargo, debe recordar cambiar todos los lugares donde usa ==
o !=
en su objeto (incluso en su implementación de Equals()
) para usar Object.ReferenceEquals()
, o para enviar ambos operandos al object
. Esta desagradable atracción (que puede causar recursión infinita en tu prueba de igualdad si no tienes cuidado) es una de las razones principales por las que rara vez anulo estos operadores.
¿Cuáles son sus condiciones para que los objetos sean iguales? – BoltClock
Básicamente, todos los valores en estos miembros de cadena, miembros dobles y las matrices deberían ser los mismos. – siva
posible duplicado de http://stackoverflow.com/questions/506096/comparing-object-properties-in-c – RameshVel