BAD*_*EED 1 c# generics iequalitycomparer
我有很多List比较,使用以下方法进行检查sequenceEqual:
this.Details.SequenceEqual<EventDetail>(event.Details, new DetailsEqualityComparer());
Run Code Online (Sandbox Code Playgroud)
因为通过这种方式,我有很多样板文件,编写了大量类似的类(除了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
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:据我在Equals方法中的假设,由于使用的 Equals 是 Object.Equals 并且我总是得到false.
错误在哪里?
好吧,你可以这样做:
return EqualityComparer<T>.Default.Equals(x, y);
Run Code Online (Sandbox Code Playgroud)
和
return EqualityComparer<T>.Default.GetHashCode(x);
Run Code Online (Sandbox Code Playgroud)
但这仍然会使用引用相等,除非Equals被覆盖T和/或T实现IEquatable<T>(这可能是您想要的,但从您的问题中并不完全清楚)。
事实上,该实现基本上会复制EqualityComparer<T>.Default,因此自定义类的使用是多余的 - 您可以EqualityComparer<T>.Default直接使用而不包装它。
| 归档时间: |
|
| 查看次数: |
3624 次 |
| 最近记录: |