2009-03-05 18 views
3

私はループ内で2つのDataRowを比較しようとしています。ただし、以下のif文はtrueを返さない:DataRowの比較が期待通りに機能しない

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 
} 

列 "名前"同じテーブル/列からのものです。だから問題はかなり単純です...私は間違って何をしていますか?あなただけの値の比較と異なる参照比較を行い、オブジェクトの比較を、行っているので

おかげ
スティーブン

答えて

7

itsmatt has saidとして、最初のスニペットは参照比較を行っています。 ToStringを呼び出す代わりにObject.Equalsを使用することです:

if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) { 
    // stuff 
} 

インスタンスメソッドの代わりに静的メソッドを使用する理由は、ヌル参照の問題を避けるためです。

+0

回答とコードのサンプルをありがとう。私は本当に.ToString()を使用したくなかった、それはどういうわけか、気分が悪かった:) – GateKiller

9

は、これらの細胞は、オブジェクトを保持します。 「これらの2つのオブジェクトは本当に同じオブジェクトなのですか?」という質問は、基本的に同じオブジェクトを参照しているため、「参照の比較」です。 ToString()を呼び出すと、文字列の比較が行われます。それがなぜ機能するのですか。

Here's a link to MS's discussion of Operator== and comparison.

+0

ありがとうございました。回避策がありますか.ToString()は私ができることは最高ですか? – GateKiller

+0

追加するには:両側を文字列にキャストすると、それも機能します。 – leppie

4

過負荷にならない場合==オペレータは、ReferenceEquals()と同一である - つまり、これは、2つの所与object sは同じインスタンスであるか否かを判断します。

ToString()への呼び出しは、文字列比較を行う==オペレータをオーバーロードしているstringクラスのオブジェクトを返します。

+0

+1、非常に良い説明 – muerte

+0

重要:*オーバーライドされた* ==演算子ではなく、オーバーロードされた*演算子です。 –

+0

@Jon Skeet - 本当にありがとう、ありがとう。編集されました。 –

関連する問題