Come posso verificare se due valori in c # sono uguali? (Dato qualsiasi tipo di valore)
Domanda
Ho questo codice qui, che ha lo scopo di consentire qualsiasi tipo di argomento:
public static void AreEqual(object expectedValue, object actualValue) {
if (expectedValue == actualValue) {
HttpContext.Current.Response.Write("Equal");
} else {
HttpContext.Current.Response.Write("Not Equal");
}
}
Se lo chiamo usando un paio di ints non si comporta molto bene.
AreEqual(3, 3) // prints Not Equal
Soluzione
Al livello più semplice:
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 generici (supporta 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");
}
}
Altri suggerimenti
Solo per evidenziare il motivo del " strano " il comportamento è perché quando si esegue il cast di un int sull'oggetto boxing . I due 3 vengono convertiti in oggetti e quindi non si confrontano più i numeri, si confrontano i riferimenti, che non saranno gli stessi.
Per verificare se i due valori degli oggetti sono uguali, utilizzare questo:
if (Object.Equals(expectedValue, actualValue)) {
Poiché l'operatore == normale presuppone che object
sia un tipo di riferimento (nonostante il fatto che anche i tipi di valore discendano dagli oggetti).
Prova:
if (expectedValue.Equals(actualValue))
e ovviamente devi gestire null
, quindi dovresti provare questo:
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");
}
Ovviamente è lo stesso della la risposta di @mike nelson :
if (Object.Equals(expectedValue, actualValue))
quindi vota la sua risposta.
if (expectedValue != null)
{
if (expectedValue.Equals(actualValue))
{
// enter code here
}
}