¿Cómo puedo verificar si dos valores en c # son iguales? (Dado cualquier tipo de valor)

StackOverflow https://stackoverflow.com/questions/828896

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo este código aquí, que está destinado a permitir cualquier tipo de argumentos:

public static void AreEqual(object expectedValue, object actualValue) {
    if (expectedValue == actualValue) {
        HttpContext.Current.Response.Write("Equal");
    } else {
        HttpContext.Current.Response.Write("Not Equal");
    }
}

Si lo llamo usando un par de entradas, no se comporta muy bien.

AreEqual(3, 3)   // prints Not Equal
¿Fue útil?

Solución

En el nivel más simple:

public static void AreEqual(object expectedValue, object actualValue) {
    if (object.Equals(expectedValue,actualValue)) {
            HttpContext.Current.Response.Write("Equal");
    } else {
            HttpContext.Current.Response.Write("Not Equal");
    }
}

O con genéricos (soporta IEquatable<T>):

public static void AreEqual<T>(T expectedValue, T actualValue) {
    if (EqualityComparer<T>.Default.Equals(expectedValue,actualValue)) {
            HttpContext.Current.Response.Write("Equal");
    } else {
            HttpContext.Current.Response.Write("Not Equal");
    }
}

Otros consejos

Solo para resaltar el motivo de " extraño " el comportamiento se debe a que cuando emite un int al objeto se produce el boxeo . Los dos 3 se convierten en objetos y ya no estás comparando números, estás comparando referencias, que no serán lo mismo.

Para verificar si los dos valores de los objetos son iguales, use esto:

if (Object.Equals(expectedValue, actualValue)) {

Como el operador normal == supone que un object es un tipo de referencia (a pesar de que los tipos de valores también descienden de los objetos).

Prueba:

if (expectedValue.Equals(actualValue))

y, por supuesto, debe manejar null, por lo que debe probar esto:

Boolean eq = false;
if (expectedValue == null || actualValue == null)
    eq = (expectedValue == actualValue);
else
    eq = expectedValue.Equals(actualValue);

if (eq) {
    HttpContext.Current.Response.Write("Equal");
} else {
    HttpContext.Current.Response.Write("Not Equal");
}

Esto es, por supuesto, lo mismo que la respuesta de @mike nelson :

if (Object.Equals(expectedValue, actualValue))

así que vota su respuesta.

if (expectedValue != null)
{
    if (expectedValue.Equals(actualValue))
    {
        // enter code here
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top