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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top