【问题标题】:DataRow comparison not working as expectedDataRow 比较未按预期工作
【发布时间】:2009-03-05 22:00:52
【问题描述】:

我正在尝试循环比较两个DataRows。但是,以下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
}

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

谢谢
斯蒂芬

【问题讨论】:

    标签: c# datarow


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。有什么解决方法或者 .ToString() 是我能做的最好的吗?
    【解决方案2】:

    作为itsmatt has said,您的第一个sn-p 正在进行参考比较。调用ToString 的替代方法是使用Object.Equals

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

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

    【讨论】:

    • 感谢您的回答和代码示例。我真的不想使用 .ToString(),感觉不太对劲 :)
    【解决方案3】:

    == 运算符,如果没有重载,则与ReferenceEquals() 相同——也就是说,它确定两个给定的objects 是否是相同的实例。

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

    【讨论】:

    • 重要:它不是 overridden == 运算符,而是 overloaded 运算符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2019-11-27
    相关资源
    最近更新 更多