2009-03-05 195 views
3

我試圖在循環中比較兩個DataRow s。但是,下面的if語句不返回trueDataRow比較不按預期方式工作

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

但是,如果我添加.ToString()每個DataRow結束時,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 
} 

之所以使用靜態方法,而不是實例方法是爲了避免空引用的問題。

9

這些細胞持有的對象,所以你正在做的一個對象比較,這只是做一個參考比較,這是從價值比較不同。它提出了這樣一個問題:「這兩個對象是否真的是同一個對象?」,實際上它們是指同一個對象,因此是「參考比較」。當您執行ToString()調用時,您將進行字符串比較。這就是它工作的原因。

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

+0

謝謝。有沒有什麼工作或是.ToString()我能做的最好? – GateKiller 2009-03-05 13:22:51

+0

要添加:如果您將雙方都轉換爲字符串,它也會起作用。 – leppie 2009-03-05 13:22:59

4

==操作者,如果未過載,是相同的ReferenceEquals() - 即,它確定兩個給定object S是否是相同的實例。

ToString()的調用返回string類的對象,該對象已重載==運算符,該運算符進行字符串比較。

+0

+1,非常好的解釋 – muerte 2009-03-05 13:24:06