DataRow Vergleich funktioniert nicht wie erwartet
Frage
Ich versuche, zwei DataRow
s in einer Schleife zu vergleichen. Allerdings ist die folgende Anweisung if
nicht true
zurück:
if (dt1.Rows[0]["Name"] == dt2.Rows[b]["Name"]) {
// This never executes
}
Wenn ich jedoch .ToString()
bis zum Ende eines jeden DataRow
hinzufügen, if
die true
Anweisung gibt:
if (dt1.Rows[0]["Name"].ToString() == dt2.Rows[b]["Name"].ToString()) {
// This now executes
}
In der Spalte „Name“ ist aus derselben Tabelle / Spalte. Die Frage ist also ganz einfach ... Was mache ich falsch?
Danke
Stephen
Lösung
Wie itsmatt gesagt hat , Ihre erste Snippet macht einen Referenz Vergleich. Eine alternative ToString
zu nennen ist Object.Equals
zu verwenden:
if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) {
// stuff
}
Der Grund für die statische Methode anstelle der Instanz-Methode ist es, Probleme mit null Verweisen zu vermeiden.
Andere Tipps
Diese Zellen halten Objekte, so dass Sie ein Objekt Vergleich tun, die nur einen Verweis Vergleich der Fall ist, die aus einem Wertvergleich unterscheidet. Es stellt sich die Frage: „Sind diese beiden Objekte wirklich das gleiche Objekt?“, Im Wesentlichen sind sie auf das gleiche Objekt beziehen, also „Referenzvergleichs“. Wenn Sie den ToString () -Aufruf zu tun, werden Sie dann String-Vergleich zu tun. Deshalb ist es funktioniert.
Hier ist ein Link zu MS der Diskussion von Operator == und Vergleich.
Der ==
Operator, wenn nicht überlastet ist, ist identisch mit ReferenceEquals()
- das heißt, sie bestimmt, ob zwei gegebene object
s die gleichen Instanzen
Der Aufruf von ToString()
gibt ein Objekt von string
Klasse, die ==
Betreiber überlastet hat, die String-Vergleich der Fall ist.