Question

J'essaie de comparer deux DataRow dans une boucle. Toutefois, l'instruction si suivante ne renvoie pas true :

if (dt1.Rows[0]["Name"] == dt2.Rows[b]["Name"]) {
    // This never executes
}

Cependant, si j'ajoute .ToString () à la fin de chaque DataRow , l'instruction si renvoie true :

if (dt1.Rows[0]["Name"].ToString() == dt2.Rows[b]["Name"].ToString()) {
    // This now executes
}

La colonne " Nom " est de la même table / colonne. Donc, la question est assez simple ... Qu'est-ce que je fais mal?

Merci
Stephen

Était-ce utile?

La solution

Comme comme l'a déclaré , votre premier extrait est faire une comparaison de référence. Une alternative à l'appel de ToString consiste à utiliser Object.Equals :

if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) {
    // stuff
}

La raison d'utiliser la méthode statique à la place de la méthode d'instance est d'éviter les problèmes de références nulles.

Autres conseils

Ces cellules contiennent des objets, ce qui vous permet d'effectuer une comparaison d'objet, qui consiste simplement à effectuer une comparaison de référence, ce qui diffère d'une comparaison de valeur. Il pose la question "Ces deux objets sont-ils vraiment le même objet?", Ils font essentiellement référence au même objet, d'où la "comparaison de référence". Lorsque vous effectuez l'appel ToString (), vous effectuez ensuite une comparaison de chaîne. C’est pourquoi cela fonctionne.

Voici un lien vers la discussion de MS sur Operator == et la comparaison.

L'opérateur == , s'il n'est pas surchargé, est identique à ReferenceEquals () - en d'autres termes, il détermine si deux objets donnés s sont les mêmes instances.

L'appel de ToString () renvoie un objet de la classe string , qui a surchargé l'opérateur == , qui effectue une comparaison de chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top