代码之家  ›  专栏  ›  技术社区  ›  Biswanath

继承相等比较器

  •  2
  • Biswanath  · 技术社区  · 17 年前

    我有一门顾客课。

    public class Customer
    {
        private string _id;
        private string _name;
        // some more properties follow 
    


    这是我打算在LINQ查询中使用的。

    如果customer.id和customer.name匹配,我将平等对待对象。

    public class MyComparer : System.Collections.Generic.EqualityComparer<Customer>
    {
        public override bool Equals(Customer x, Customer y)
        {
            if (x.Id == y.Id && x.Name == y.Name)
                return true;
            else
                return false;
        }
    
        public override int GetHashCode(Customer obj)
        {
            return string.Concat(obj.Id,obj.Name).GetHashCode();
        }
    
    }
    

    我提到 generating hashcode .

    3 回复  |  直到 9 年前
        1
  •  7
  •   Community Mohan Dere    9 年前

    看见 this question on hashcodes 这是一种基于多个字段返回一个哈希代码的非常简单的方法。

    话虽如此,我不会从中得出结论 EqualityComparer<T> IEqualityComparer<T> 直接地我不确定它的价值 除了实现非泛型的 IEqualityComparer .

    还有几件事:

    • 您应该在Equals中处理空值
    • 您当前的代码可以简化为:

      return x.Id == y.Id && x.Name == y.Name;
      

    Equals的更全面实现可能是:

    public override bool Equals(Customer x, Customer y)
    {
        if (object.ReferenceEquals(x, y))
        {
            return true;
        }
        if (x == null || y == null)
        {
            return false;
        }
        return x.Id == y.Id && x.Name == y.Name;
    }
    
        2
  •  3
  •   liggett78    17 年前

    您应该从可能的“冲突”的角度来看待它,例如,当两个不同的对象获得相同的哈希代码时。这可能是“1,2any”和“12,any”等对的情况,这些对中的值是“id”和“name”。如果您的数据无法实现这一点,那么您可以继续。否则,您可以将其更改为:

    return obj.Id.GetHashCode() ^ obj.Name.GetHashCode();
    
        3
  •  1
  •   Mike Two    17 年前

    public override int GetHashCode(Customer obj)
    {
        unchecked
        {
            return ((obj.Id != null ? obj.Id.GetHashCode() : 0) * 397) 
                ^ (obj.Name != null ? obj.Name.GetHashCode() : 0);
        }
    }
    

    我必须承认,我几乎总是让Resharper为我生成相等和哈希代码实现。我已经对它们的实现进行了大量测试,发现它与我手工编写的任何东西一样好。因此,我通常会使用不必键入的实现。