C# 使用泛型的相等比较器

C# 使用泛型的相等比较器,c#,generics,iequalitycomparer,C#,Generics,Iequalitycomparer,我有很多列表比较,使用sequenceEqual检查: this.Details.SequenceEqual<EventDetail>(event.Details, new DetailsEqualityComparer()); 问题是:就我在Equals方法中的假设而言,因为使用的Equals是Object.Equals,我总是得到false 错误在哪里?嗯,您可以: 返回EqualityComparer.Default.Equals(x,y); 及 返回EqualityCom

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

this.Details.SequenceEqual<EventDetail>(event.Details, new DetailsEqualityComparer());
问题是:就我在
Equals
方法中的假设而言,因为使用的Equals是Object.Equals,我总是得到
false

错误在哪里?

嗯,您可以:

返回EqualityComparer.Default.Equals(x,y);

返回EqualityComparer.Default.GetHashCode(x);
但这仍然会使用引用等式,除非
T
和/或
T
实现
IEquatable
(这可能是您想要的,但您的问题并不完全清楚)

事实上,该实现基本上是复制
EqualityComparer.Default
,因此自定义类的使用是多余的-您可以直接使用
EqualityComparer.Default
,而无需包装它。

您可以:

返回EqualityComparer.Default.Equals(x,y);

返回EqualityComparer.Default.GetHashCode(x);
但这仍然会使用引用等式,除非
T
和/或
T
实现
IEquatable
(这可能是您想要的,但您的问题并不完全清楚)


事实上,该实现基本上是复制
EqualityComparer.Default
,因此,自定义类的使用是多余的-您可以直接使用
EqualityComparer.Default
,而无需包装它。

您似乎重新实现了调用实例的
Equals
GetHashCode
的默认相等比较器,当类没有实现时,它实际上会返回到
对象的实现

可能要将比较器/哈希代码方法传递到比较器中:

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);
   }
class GenericEqualityComparer:IEqualityComparer其中T:class
{
Func-myCompare;
公共通用资格比较员(
Func myCompare,Func myGetHashCode)
{
this.myCompare=myCompare;
...
}
公共布尔等于(TX,TY)
{
....
返回myCompare(T,T);
}

您似乎重新实现了调用实例的
Equals
GetHashCode
的默认相等比较器,当类未实现时,它实际上会返回到
对象的实现

可能要将比较器/哈希代码方法传递到比较器中:

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);
   }
class GenericEqualityComparer:IEqualityComparer其中T:class
{
Func-myCompare;
公共通用资格比较员(
Func myCompare,Func myGetHashCode)
{
this.myCompare=myCompare;
...
}
公共布尔等于(TX,TY)
{
....
返回myCompare(T,T);
}

如果他已经在基类型中重写了这些方法,他不需要创建一个新的
EqualityComparer
来使用
EqualityComparer.Default
,他只需要使用
EqualityComparer.Default
而不使用包装器。@Servy同意-这就是我在上一节中的意思。我想你解释得更清楚了但是,如果他已经在基类型中重写了这些方法,他不需要创建一个新的
EqualityComparer
来使用
EqualityComparer.Default
,他只需要在没有包装器的情况下使用
EqualityComparer.Default
。@Servy同意-这就是我在上一节中的意思。我想你解释得更清楚了但是,您希望它与默认的相等比较器有什么不同?您希望它与默认的相等比较器有什么不同?
return EqualityComparer<T>.Default.GetHashCode(x);
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);
   }