Il confronto di DataRow non funziona come previsto
Domanda
Sto cercando di confrontare due DataRow
in un ciclo. Tuttavia, la seguente istruzione if
non restituisce true
:
if (dt1.Rows[0]["Name"] == dt2.Rows[b]["Name"]) {
// This never executes
}
Tuttavia, se aggiungo .ToString ()
alla fine di ogni DataRow
, l'istruzione if
restituisce true
:
if (dt1.Rows[0]["Name"].ToString() == dt2.Rows[b]["Name"].ToString()) {
// This now executes
}
La colonna " Nome " proviene dalla stessa tabella / colonna. Quindi la domanda è abbastanza semplice ... Cosa sto facendo di sbagliato?
Grazie
Stephen
Soluzione
Come ha detto itsmatt , il tuo primo frammento è: facendo un confronto di riferimento. Un'alternativa alla chiamata ToString
è usare Object.Equals
:
if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) {
// stuff
}
Il motivo dell'utilizzo del metodo statico anziché del metodo dell'istanza è di evitare problemi con riferimenti null.
Altri suggerimenti
Quelle celle contengono oggetti, quindi stai facendo un confronto di oggetti, che fa solo un confronto di riferimento, che è diverso da un confronto di valori. Pone la domanda "Questi due oggetti sono davvero lo stesso oggetto?", Essenzialmente si riferiscono allo stesso oggetto, quindi "confronto di riferimento". Quando esegui la chiamata ToString (), esegui il confronto delle stringhe. Ecco perché funziona.
Ecco un link alla discussione di MS sull'operatore == e il confronto.
L'operatore ==
, se non sovraccaricato, è identico a ReferenceEquals ()
, ovvero determina se due dati oggetto
sono le stesse istanze.
La chiamata a ToString ()
restituisce un oggetto della classe string
, che ha sovraccaricato l'operatore ==
, che esegue il confronto delle stringhe.