Come posso verificare se due valori in c # sono uguali? (Dato qualsiasi tipo di valore)

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

  •  06-07-2019
  •  | 
  •  

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
È stato utile?

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
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top