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

标签 c# linq compare

当我查找通用 IEqualityComparermsdn 上的界面我注意到该接口(interface)是在一个单独的“比较器”类中实现的,而不是 IEquatable<T>这是在类本身中实现的。当我搜索更多示例时,每个示例都在使用一个单独的类,这让我想知道:为什么不在类本身上实现它?

我可以想象覆盖 object.Equalsobject.GetHashCode不被认为是好的做法,因为它在很多不同的情况下使用,但即使是 msdn 也说(强调我的):

This interface allows the implementation of customized equality comparison for collections.

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

  1. 类集合的不同方法需要不同的比较器。
  2. 该类很大,不需要实例化它的另一个对象(尽管如果这确实是问题所在,为什么不拥有它的整个集合也不错?)。

所以我的问题是:

是否有任何我忽略的特殊原因导致每个人都定义另一个比较器类只是为了比较而不是仅仅在类本身上实现接口(interface)(至少在我看来这不会更糟)?

一个小例子:

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(); }
}

最佳答案

why not implement it on the class itself?

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

如果你想让类本身实现相等逻辑,那么你应该实现IEquatable<T>这是专门为这种情况提供的,EqualityComparer<T>.Default随时为您的实现提供必要的桥梁IEqualityComparer<T>是需要的,没有明确指定。

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

关于c# - 为什么在单独的类中实现 IEqualityComparer<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35314461/

相关文章:

c++ - 我应该为 map 中的两个智能指针对制作自己的比较器吗?

c# - 是 Controller 异步中的后台 worker 吗?

c# - DataGrid - 新数据到达时重置网格选择

c# - 从列表中获取请求的列不同值

mysql - Linq-查询主体必须以 C# 中的 select 子句或 group 子句结尾

将数组中的 char 元素与运算符进行比较

mysql - 查询某些值发生变化的数据

c# - .net core 2.2,从 serilog 的用户 secret 中读取设置

c# - 代表和事件

c# - 在查看 ANTS 分析器时,FirstOrDefault 明显快于 SingleOrDefault