首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查两个对象实例是否相同

检查两个对象实例是否相同
EN

Stack Overflow用户
提问于 2010-09-21 21:17:44
回答 5查看 4.7K关注 0票数 10

我需要比较两个对象,但在一次命中中比较它们的多个属性。这不是为了排序,而是为了确认是否有任何更改;因为其中一个是旧的已保存实例,第二个是同一事物的新导入实例

我认为这最好通过编写自定义比较器来实现。我只是有点困惑,不知道是做IComparer,还是做IComparable,或者做什么tbh。

谢谢

nat

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-21 21:30:20

如果您的类只有一个相等的定义,那么您实际上不需要实现任何接口:只需覆盖Equals方法。不过,最佳实践是实现IEquatable并明智地覆盖GetHashCode (如果您不覆盖散列代码,当集合类、LINQ方法等将其用作相等的前提条件时,相等将表现不佳)。下面是一个示例实现:

代码语言:javascript
复制
public class Person : IEquatable<Person>
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override int GetHashCode()
    {
        return (Name == null ? 0 : Name.GetHashCode()) ^ Age;
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Person);
    }

    public bool Equals(Person other)
    {
        return other != null && other.Name == Name && other.Age == Age;
    }
}

这将允许您执行以下操作:

代码语言:javascript
复制
Person savedPerson = ...
Person importedPerson = ...

bool hasChanged = !savedPerson.Equals(importedPerson);

另一方面,如果您对不同的情况有很多不同的相等定义,那么最好的办法就是编写不同的IEqualityComparer实现。下面是一个示例实现:

代码语言:javascript
复制
public class AgeComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        return (x == null || y == null) ? x == y : x.Age == y.Age;
    }

    public int GetHashCode(Person obj)
    {
        return obj == null ? 0 : obj.Age;
    }
}  

在这种情况下,检查将如下所示:

代码语言:javascript
复制
Person savedPerson = ...
Person importedPerson = ...
IEqualityComparer<Person> comparer = ...

bool hasChanged = !comparer.Equals(savedPerson, importedPerson);
票数 10
EN

Stack Overflow用户

发布于 2010-09-21 21:22:02

是的,你需要你的类型来实现IComparable。Here是一个关于如何做到这一点的示例。

票数 0
EN

Stack Overflow用户

发布于 2010-09-21 21:30:35

正如您提到的,IComparable通常用于排序。

在这种情况下,您可能希望重载比较运算符:==

因为反向比较也应该是有效的,这意味着您还必须重载!=运算符。

当你重载==和!-时,你也需要重写Equals和GetHashCode。

一本像样的C#书应该能解释细节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3760644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档