nat*_*nat 9 c# compare equality properties
我需要比较两个对象,但在一次点击中比较它们的一些属性.这不是为了排序,而是为了确认是否有任何变化; 因为一个是旧保存的实例,第二个是同一事物的新导入实例
我认为通过编写自定义比较器可以获得最佳效果.只是有点困惑,是否要做IComparer,或IComparable,或什么tbh.
谢谢
NAT
如果您的类只有单一的相等定义,则实际上不需要实现任何接口:只需覆盖该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)