【问题标题】:Binary Compare Objects二进制比较对象
【发布时间】:2016-03-17 19:09:54
【问题描述】:

我需要比较同一类的 2 个对象。我确信最快的方法是将它们读取为数字,所以如果它们相等,(int)Obj1 - (int)Obj2 会给我 0。但是,看起来我不能那样投。你知道如何快速比较对象吗?我希望避免遍历所有参数,因为不需要知道区别在哪里。

【问题讨论】:

  • 没有捷径,除非你已经实现了IEquatable 或覆盖了Equals
  • 参见this 了解二进制等价性。
  • 更健壮的解决方案是序列化和比较。但这不会很快。
  • @thepirat000 我无法序列化这些对象。检查了 Yuval Itzchakov 解决方案并标记为“工作”的帖子不起作用。对于同一属性具有不同值的对象返回 true。但是代码对我来说看起来正确。

标签: c# .net equality


【解决方案1】:

如果你想比较两个引用是否来自同一个对象,你可以使用 equals 方法。如果要比较类中的属性,则需要重写类中的 Equals 方法。

public override bool Equals(object obj)
    {
        if (obj == null)
            return false;
        if (!(obj is Person))
            return false;
        return Name == ((Person) obj).Personer; 

【讨论】:

  • 我一直更喜欢Person p = obj as Person; if(obj == null) return false; 以避免潜在的投射两次。另外,我认为您想比较两个实例中的相同属性return Name == ((Person obj).Name; 或我的建议return Name == p.Name;
  • 不是完全错误,但是... 由于无法知道Equals 是否使用引用或值语义声明“比较两个引用是否来自同一个对象,您可以使用equals ......”充其量是不完整的。 IE。字符串呢?
  • 这实际上是一个更好的方法。 +1
  • 旁注:在某些情况下,您的代码会错误地与 null 进行比较 - 请参阅 stackoverflow.com/questions/3143498/why-check-this-null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2011-11-22
  • 2016-08-16
  • 2013-11-28
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多