Comment puis-je vérifier si deux valeurs dans c # sont égales? (Quel que soit le type de valeur)

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

  •  06-07-2019
  •  | 
  •  

Question

J'ai ce code ici, destiné à autoriser tout type d'argument:

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

Si j'appelle cela en utilisant quelques ints, cela ne se comporte pas très bien.

AreEqual(3, 3)   // prints Not Equal
Était-ce utile?

La solution

Au niveau le plus 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");
    }
}

Ou avec des génériques (prend en charge 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");
    }
}

Autres conseils

Juste pour souligner la raison du " étrange " le comportement est dû au fait que lorsque vous convertissez un int en objet, boxe se produit. Les deux 3 sont convertis en objets et vous ne comparez plus les nombres, vous comparez les références, qui ne seront plus les mêmes.

Pour vérifier si les deux valeurs d'objet sont égales, utilisez ceci:

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

Comme l'opérateur normal == suppose qu'un object est un type de référence (bien que les types de valeur descendent également des objets).

Essayez:

if (expectedValue.Equals(actualValue))

et bien sûr, vous devez gérer null, vous devriez donc essayer ceci:

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");
}

Ceci est bien entendu identique à la réponse de @mike nelson :

if (Object.Equals(expectedValue, actualValue))

alors allez upvote sa réponse.

if (expectedValue != null)
{
    if (expectedValue.Equals(actualValue))
    {
        // enter code here
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top