使用泛型的相等比较器

BAD*_*EED 1 c# generics iequalitycomparer

我有很多List比较,使用以下方法进行检查sequenceEqual

this.Details.SequenceEqual<EventDetail>(event.Details, new DetailsEqualityComparer());
Run Code Online (Sandbox Code Playgroud)

因为通过这种方式,我有很多样板文件,编写了大量类似的类(除了Equals和 的类型参数getHashCodeaClassEqualityCompareranotherClassEqualityComparer等等......

此时,我想以这种方式使用泛型重写我的比较器:

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.

错误在哪里?

D S*_*ley 5

好吧,你可以这样做:

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直接使用而不包装它。