我正在尝试比较循环中的两个DataRow
。但是,以下if
语句不会返回true
:
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
}
“名称”列来自同一个表/列。所以问题很简单......我做错了什么?
感谢
斯蒂芬
答案 0 :(得分:9)
这些单元格保存对象,因此您正在进行对象比较,这只是进行参考比较,这与值比较不同。它问的问题是“这两个对象真的是同一个对象吗?”,基本上它们指的是同一个对象,因此是“参考比较”。当您执行ToString()调用时,您正在进行字符串比较。这就是它运作的原因。
Here's a link to MS's discussion of Operator== and comparison.
答案 1 :(得分:7)
作为itsmatt has said,您的第一个代码段正在进行参考比较。调用ToString
的另一种方法是使用Object.Equals
:
if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) {
// stuff
}
使用静态方法而不是实例方法的原因是为了避免空引用的问题。
答案 2 :(得分:4)
==
运算符(如果没有重载)与ReferenceEquals()
相同 - 也就是说,它确定两个给定的object
是否是相同的实例。
对ToString()
的调用返回string
类的对象,该对象具有重载==
运算符,该运算符进行字符串比较。