枚举的两个重载之间的差异.除外

本文关键字:之间 除外 重载 枚举 两个 | 更新日期: 2023-09-27 18:33:54

我试图了解Enumerable.Except方法的两个重载之间的区别,即

  • 除了(IEnumerable, IEnumerable)
  • 除了(IEnumerable, IEnumerable,IEqualityComparer)

显然,第一个区别是第一个重载使用默认的相等比较器,而另一个重载使用 IEqualityComparer,但我可以通过实现 IEquatable 接口(如 MSDN 文档中提到的Except方法)来使用第一种方法获得相同的结果,那么为什么需要第二个重载?

枚举的两个重载之间的差异.除外

两个原因:

  1. 您只能为自己的类型实现IEquatable<T>...而您可以为任何类型的指定IEqualityComparer<T>,无论您是否可以自己修改它。

  2. 可能有多种方法可以比较相等类型,但实现IEquatable<T>只允许您表达其中一种。

所有这些的简单示例是字符串 - 考虑:

string[] x = { "A", "B", "C" };
string[] y = { "A", "c" };
var bc = x.Except(y);
var justB = x.Except(y, StringComparer.OrdinalIgnoreCase);

我们可能希望在不同的情况下同时获得这两种结果,这意味着我们无法用IEquatable<T>来处理这两种结果......无论如何,我们无法改变string实施IEquatable<T>的方式。(当然,您不仅限于StringComparer - 例如,您可以编写一个仅使用字符串长度的相等比较器。

这也不是特定于 LINQ 的 - 通常适用于任何处理相等的 API,例如 HashSet<>Dictionary<,>