3

我试图DataRow在一个循环中比较两个 s 。但是,以下if语句不会返回true

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

但是,如果我添加.ToString()到 each 的末尾DataRow,则if语句返回true

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

“名称”列来自同一个表/列。所以问题很简单......我做错了什么?

谢谢
斯蒂芬

4

3 回答 3

9

这些单元格包含对象,因此您正在进行对象比较,它只是进行参考比较,这与值比较不同。它提出的问题是“这两个对象真的是同一个对象吗?”,本质上它们是指同一个对象,因此是“参考比较”。当您执行 ToString() 调用时,您正在执行字符串比较。这就是它起作用的原因。

这是 MS 对 Operator== 和比较的讨论的链接。

于 2009-03-05T13:21:26.170 回答
7

正如其马特所说,您的第一个片段正在做参考比较。调用的替代方法ToString是使用Object.Equals

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

使用静态方法而不是实例方法的原因是为了避免空引用的问题。

于 2009-03-05T13:24:22.183 回答
4

运算符,如果==没有重载,则等同于ReferenceEquals()-- 即,它确定两个给定object的 s 是否是相同的实例。

调用ToString()返回一个string类对象,该对象具有重载==运算符,用于进行字符串比较。

于 2009-03-05T13:23:08.973 回答