La comparaison de DataRow ne fonctionne pas comme prévu
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
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.