使用泛型的相等比较器

本文关键字:比较器 泛型 | 更新日期: 2023-09-27 18:07:52

我有很多List比较,使用sequenceEqual检查:

this.Details.SequenceEqual<EventDetail>(event.Details, new DetailsEqualityComparer());

因为以这种方式,我有很多样板文件,编写了大量的类非常相似(除了EqualsgetHashCode的类型参数)命名为aClassEqualityComparer, anotherClassEqualityComparer等…

在这一点上,我想用泛型重写比较器,如下所示:
class GenericEqualityComparer<T> : IEqualityComparer<T> where T : class
{
    public bool Equals(T x, T y)
    {
        if (Object.ReferenceEquals(x, y)) return true;
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;
        return x.Equals(y);  // here comes the problems
    }
    public int GetHashCode(T obj)
    {
        // some hashing calculation
    }
}

问题是:据我猜想,在Equals方法中,因为使用的Equals是对象。等于,我总是得到false

错误在哪里?

使用泛型的相等比较器

,你:

return EqualityComparer<T>.Default.Equals(x, y);

return EqualityComparer<T>.Default.GetHashCode(x);

,但这将仍然使用引用相等,除非EqualsT和/或T实现IEquatable<T>(这可能是你想要的,但从你的问题中并不完全清楚)。

实际上,该实现基本上复制了EqualityComparer<T>.Default,所以使用自定义类是多余的-您可以直接使用EqualityComparer<T>.Default而无需包装它。

您似乎重新实现了调用实例的EqualsGetHashCode的默认相等比较器,这在未由类实现时确实会回落到Object的实现。

可能你想传递比较器/哈希码方法到你的比较器:

class GenericEqualityComparer<T> : IEqualityComparer<T> where T : class
{
   Func<T,T,bool> myCompare;
   public GenericEqualityComparer<T>(
      Func<T,T,bool> myCompare, Func<T,int> myGetHashCode)
   {
      this.myCompare= myCompare;                 
       ...
   }
   public bool Equals(T x, T y)
   {
     ....
     return myCompare(T,T);
   }