检查两个对象实例以查看它们是否相同

nat*_*nat 9 c# compare equality properties

我需要比较两个对象,但在一次点击中比较它们的一些属性.这不是为了排序,而是为了确认是否有任何变化; 因为一个是旧保存的实例,第二个是同一事物的新导入实例

我认为通过编写自定义比较器可以获得最佳效果.只是有点困惑,是否要做IComparer,或IComparable,或什么tbh.

谢谢

NAT

Ani*_*Ani 9

如果您的类只有单一的相等定义,则实际上不需要实现任何接口:只需覆盖该Equals方法即可.但是,最好的做法是实现IEquatable<T>GetHashCode明智地覆盖(如果你不覆盖哈希代码,当集合类,LINQ方法等将它用作相等的前提条件时,相等性将是错误的).这是一个示例实现:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许您:

Person savedPerson = ...
Person importedPerson = ...

bool hasChanged = !savedPerson.Equals(importedPerson);
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}  
Run Code Online (Sandbox Code Playgroud)

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

Person savedPerson = ...
Person importedPerson = ...
IEqualityComparer<Person> comparer = ...

bool hasChanged = !comparer.Equals(savedPerson, importedPerson);
Run Code Online (Sandbox Code Playgroud)