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