2009-03-05 45 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