質問

ループ内の2つの DataRow を比較しようとしています。ただし、次の if ステートメントは true を返しません。

if (dt1.Rows[0]["Name"] == dt2.Rows[b]["Name"]) {
    // This never executes
}

ただし、各 DataRow の最後に .ToString()を追加すると、 if ステートメントは true

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()呼び出しを行うと、文字列の比較を行っています。それが動作する理由です。

ここに、MSのOperator ==および比較に関するディスカッションへのリンクがあります。

== 演算子は、オーバーロードされていない場合、 ReferenceEquals()と同じです。つまり、2つの object sは同じインスタンスです。

ToString()を呼び出すと、 string クラスのオブジェクトが返されます。このクラスには、文字列比較を行う == 演算子がオーバーロードされています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top