我有很多List
比较,使用sequenceEqual
检查:
this.Details.SequenceEqual<EventDetail>(event.Details, new DetailsEqualityComparer());
因为通过这种方式,我有很多样板文件,编写了大量的类(Equals
和getHashCode
的类型参数除外),名为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
。
错误在哪里?
答案 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)
您似乎重新实现了调用实例Equals
和GetHashCode
的默认相等比较器,当该类未实现时,它确实会回退到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);
}