使用泛型的相等比较器
本文关键字:比较器 泛型 | 更新日期: 2023-09-27 18:07:52
我有很多List
比较,使用sequenceEqual
检查:
this.Details.SequenceEqual<EventDetail>(event.Details, new DetailsEqualityComparer());
因为以这种方式,我有很多样板文件,编写了大量的类非常相似(除了Equals
和getHashCode
的类型参数)命名为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);
,但这将仍然使用引用相等,除非Equals
为T
和/或T
实现IEquatable<T>
(这可能是你想要的,但从你的问题中并不完全清楚)。
实际上,该实现基本上复制了EqualityComparer<T>.Default
,所以使用自定义类是多余的-您可以直接使用EqualityComparer<T>.Default
而无需包装它。
您似乎重新实现了调用实例的Equals
和GetHashCode
的默认相等比较器,这在未由类实现时确实会回落到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);
}