La comparación de DataRow no funciona como se esperaba
Pregunta
Estoy tratando de comparar dos DataRow
en un bucle. Sin embargo, la siguiente declaración de if
no devuelve true
:
if (dt1.Rows[0]["Name"] == dt2.Rows[b]["Name"]) {
// This never executes
}
Sin embargo, si agrego .ToString ()
al final de cada DataRow
, la instrucción if
devuelve true :
if (dt1.Rows[0]["Name"].ToString() == dt2.Rows[b]["Name"].ToString()) {
// This now executes
}
La columna " Nombre " Es de la misma tabla / columna. Entonces la pregunta es bastante simple ... ¿Qué estoy haciendo mal?
Gracias
Stephen
Solución
Como itsmatt ha dicho , su primer fragmento es haciendo una comparación de referencia. Una alternativa a llamar a ToString
es usar Object.Equals
:
if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) {
// stuff
}
La razón para usar el método estático en lugar del método de instancia es evitar problemas con referencias nulas.
Otros consejos
Esas celdas contienen objetos, por lo que está haciendo una comparación de objetos, que solo hace una comparación de referencia, que es diferente de una comparación de valores. Hace la pregunta "¿Son estos dos objetos realmente el mismo objeto?", Esencialmente se refieren al mismo objeto, por lo tanto, "comparación de referencia". Cuando haces la llamada ToString (), estás haciendo una comparación de cadenas. Es por eso que funciona.
Aquí hay un enlace a la discusión de MS sobre Operador == y comparación.
El operador ==
, si no está sobrecargado, es idéntico a ReferenceEquals ()
, es decir, determina si dos objetos dados
s son las mismas instancias.
La llamada a ToString ()
devuelve un objeto de la clase string
, que ha sobrecargado al operador ==
, que hace una comparación de cadenas.