¿Cómo puedo verificar si dos valores en c # son iguales? (Dado cualquier tipo de valor)
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
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
}
}