使用泛型的等式比较器

时间:2014-06-09 16:43:00

标签: c# generics iequalitycomparer

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

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

因为通过这种方式,我有很多样板文件,编写了大量的类(EqualsgetHashCode的类型参数除外),名为aClassEqualityComparer,{{1}等等...

此时,我曾想过以这种方式使用泛型重写我的比较器:

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是Object.Equals,我总是得到Equals

错误在哪里?

2 个答案:

答案 0 :(得分:4)

嗯,你可以做:

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

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

仍然仍然使用引用相等性,除非Equals覆盖T和/或T实现IEquatable<T>(这可能是什么)你想要,但你的问题并不完全清楚。)

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

答案 1 :(得分:1)

您似乎重新实现了调用实例EqualsGetHashCode的默认相等比较器,当该类未实现时,它确实会回退到Object&#39;实施。

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

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);
   }