Comment puis-je vérifier si deux valeurs dans c # sont égales? (Quel que soit le type de valeur)
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
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
}
}