为什么在单独的类中实现IEqualityComparer <T>

Ale*_*rck 5 c# linq compare

当我IEqualityComparermsdn上查找通用接口时,我注意到接口是在一个单独的"comparer"类IEquatable<T>中实现的,与类本身相反.当我搜索更多的例子时,每一个都使用一个单独的类,这让我想知道:为什么不在类本身上实现它?

我能想象压倒一切object.Equals,并object.GetHashCode因为它在很多不同的情况下使用不被认为是很好的做法,但即使MSDN说(重点煤矿):

此接口允许实现集合的自定义相等性比较.

因此它的用途几乎仅限于Linq.我可以想到为什么定义一个单独的比较器类只有两个原因:

  1. 对类集合的不同方法需要不同的比较器.
  2. 这个类很大,并且实例化它的另一个对象是不可取的(尽管如果这真的是问题,为什么没有整个集合它不坏?).

所以我的问题是:

有没有什么特别的原因让我忽略了导致每个人都只是为了比较来定义另一个comparerclass而不仅仅是在类本身上实现接口(在我看来,至少可以说这不会更糟)?

一个小例子:

public static void Main(string[] args)
{
    Test t1 = new Test { id = 1, date = default(DateTime) };
    Test t2 = new Test { id = 1, date = default(DateTime) };
    Test t3 = new Test { id = 0, date = default(DateTime) };
    List<Test> testList = new List<Test>{ t1, t2, t3 };

    //Same result
    int distinctCountClass = testList.Distinct(new Test()).Count();
    int distinctCountComparerClass = testList.Distinct(new TestComparer()).Count();
}

public partial class Test
{
    public int id { get; set; }
    public DateTime date { get; set; }
}

public partial class Test : IEqualityComparer<Test>
{
    public bool Equals(Test x, Test y) { return x.id == y.id && x.date == y.date; }
    public int GetHashCode(Test obj) { return obj.id.GetHashCode(); }
}

public class TestComparer : IEqualityComparer<Test>
{
    public bool Equals(Test x, Test y) { return x.id == y.id && x.date == y.date; }
    public int GetHashCode(Test obj) { return obj.id.GetHashCode(); }
}
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 5

为什么不在类本身上实现它?

因为没有意义。的全部目的IEqualityComparer<T>是在类型之外实现,T因为它针对您帖子中的“原因 1”

如果您希望类本身实现等式逻辑,那么您应该实现IEquatable<T>专为此类场景EqualityComparer<T>.Default提供的功能,并且将在需要IEqualityComparer<T>且未明确指定的任何时候为您的实现提供必要的桥梁。

由于该类只能提供一个没有任何动态行为和/或选项的硬编码逻辑,因此它被认为是默认的相等逻辑,因此EqualityProvider<T>提供对其进行访问的静态属性的名称。