如何在不破坏现有Object.Equals()的情况下检查两个对象的属性是否相等?

mic*_*ael 11 c# equals object hashcode

基本上,GethashCode是不同的,即使它们包含属性的SAME值...那么为什么默认返回diff hashcodes?

public class User
{
    public Int32 Id { get; set; }
    public String Username { get; set; }
}

User a = new User();
a.Id = 1;
a.Username = "Hello";

User b = new User();
b.Id = 1;
b.Username = "Hello";

Console.WriteLine("Hash A: {0} | Hash B: {1}", a.GetHashCode(), b.GetHashCode());
//Hash A: 37121646 | Hash B: 45592480 <-- these values change each time I rerun the app?
Run Code Online (Sandbox Code Playgroud)

有没有更合适的方法来实现它,所以我不会破坏Object.Equals如何为我的对象工作,但我仍然可以根据参数值进行自己的相等检查?

我问的原因是因为我有一个服务:SynchronizeUsers()下载一组用户.我宁愿只更新需要更新的那些,删除同步所说的那些,而不是清除我的用户缓存,而是添加新的.但是,我不能只对这些对象做Object.Equals().

小智 18

回答太晚了,但有人可能会在这里结束,我需要知道我的想法是对还是错。如果严格考虑值,那么为什么不将对象设为 JSON 并比较 JSON 字符串呢?喜欢:

if (JsonConvert.SerializeObject(obj1) == JsonConvert.SerializeObject(obj2)) continue;
Run Code Online (Sandbox Code Playgroud)

  • 最佳答案,因为它允许代码具有动态对象。 (4认同)
  • 如此简单但又如此聪明 (2认同)

pel*_*zem 11

您是否尝试过实现自己的IEqualityComparer?您可以将此传递给.Equals()重载以定义您自己的自定义相等逻辑,如

用户A =用户B,即使它们是不同的实例,如果属性x,y,z相同.

请参阅: MSDN

编辑:我应该写的你可以实例化你的EqualityComparer并将两个实例传递给它的Equals()方法并得到一个bool.基本控制台应用程序...将显示true,false,false.事情是微不足道的,有两个属性显示.

var comparer = new ThingEqualityComparer();

Console.WriteLine(comparer.Equals(new Thing() { Id = 1, Name = "1" }, new Thing() { Id = 1, Name = "1" }));
Console.WriteLine(comparer.Equals(new Thing() { Id = 1, Name = "1" }, new Thing() { Id = 2, Name = "2" }));
Console.WriteLine(comparer.Equals(new Thing() { Id = 1, Name = "1" }, null));


class ThingEqualityComparer : IEqualityComparer<Thing>
{
    public bool Equals(Thing x, Thing y)
    {
        if (x == null || y == null)
            return false;

        return (x.Id == y.Id && x.Name == y.Name);
    }

    public int GetHashCode(Thing obj)
    {
        return obj.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)


RJB*_*RJB 10

如果您安装了ReSharper(这是值得的!)那么您所要做的就是:

Alt+Insert
Run Code Online (Sandbox Code Playgroud)

将光标放在类中.部分类可以隐藏样板.

它会自动为每个属性实现相等性检查.

(选择所有属性w/Ctrl + A,你可以检查所有w/Space!)