【问题标题】:Comparing two objects .比较两个对象。
【发布时间】:2009-01-04 16:37:25
【问题描述】:

如果我有一个复杂的对象,编写代码来比较 2 个实例以查看它们是否相同的最佳实践模式是什么

【问题讨论】:

    标签: c#


    【解决方案1】:

    实现 IEquatable 接口。这定义了一个通用方法,值类型或类实现该方法以创建用于确定实例相等性的特定于类型的方法。不要忘记也覆盖 Equals(object) 。 更多信息在这里:

    http://msdn.microsoft.com/en-us/library/ms131187.aspx

    【讨论】:

    • 这与 IComparable 有何不同
    • IEquatable 只会告诉你它们是否相同。 IComparable 会给你一个相对的排序。对于未排序但可相等的对象(例如图像),您不能使用 IComparable。
    • .Equals() 和 == 一样吗??
    • 不,它没有。这是一个简单的参考比较。更多信息在这里:msdn.microsoft.com/en-us/library/53k8ybth(VS.80).aspx
    • 更多信息,除非您覆盖 == 运算符,否则它会进行简单的参考比较
    【解决方案2】:

    我认为答案很大程度上取决于问题。例如,您可能希望仅当对象的所有属性都相等时才认为对象相等。这可能是每个对象没有唯一标识属性的情况。如果有这样一个(或多个)属性(例如 ID 或 ID 和版本)唯一标识该类型的每个对象,那么您可能只想基于该(或多个属性)进行比较。

    然而,基本模式应该是这样的:

    if their references are equal (includes both null)
       return true
    else if one object is null
       return false
    else
       return value based on relevant properties
    

    请注意,如果您覆盖 Equals 运算符,您还需要覆盖 GetHashCode() 以便等效对象的哈希码相同。这将确保使用哈希码确定重复键的数据结构在对象用作键时正常工作。

    【讨论】:

      【解决方案3】:

      既然你提到了一个复杂对象,请确保复杂对象中的所有复合对象都实现了 tvanfosson 提到的 equals(Object)。最后利用所有复合对象的equals在Complex对象中实现equals

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-02
        • 2014-01-26
        • 2012-08-17
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多