質問
ループ内の2つの DataRow
を比較しようとしています。ただし、次の if
ステートメントは true
を返しません。
if (dt1.Rows[0]["Name"] == dt2.Rows[b]["Name"]) {
// This never executes
}
ただし、各 DataRow
の最後に .ToString()
を追加すると、 if
ステートメントは true を返しますcode>:
if (dt1.Rows[0]["Name"].ToString() == dt2.Rows[b]["Name"].ToString()) {
// This now executes
}
列" Name"同じテーブル/列からのものです。質問は非常に簡単です...何が間違っていますか?
ありがとう
スティーブン
解決
itsmattが言ったように、最初のスニペットは参照比較を行います。 ToString
を呼び出す代わりに、 Object.Equals
:
if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) {
// stuff
}
インスタンスメソッドの代わりに静的メソッドを使用する理由は、null参照の問題を回避するためです。
他のヒント
これらのセルはオブジェクトを保持するため、オブジェクト比較を実行します。オブジェクト比較は、値の比較とは異なる参照比較のみを行います。 「これらの2つのオブジェクトは本当に同じオブジェクトですか?」という質問に答えます。本質的に、これらは同じオブジェクトを参照しているため、「参照比較」です。 ToString()呼び出しを行うと、文字列の比較を行っています。それが動作する理由です。
==
演算子は、オーバーロードされていない場合、 ReferenceEquals()
と同じです。つまり、2つの object
sは同じインスタンスです。
ToString()
を呼び出すと、 string
クラスのオブジェクトが返されます。このクラスには、文字列比較を行う ==
演算子がオーバーロードされています。
所属していません StackOverflow