枚举的两个重载之间的差异.除外
本文关键字:之间 除外 重载 枚举 两个 | 更新日期: 2023-09-27 18:33:54
我试图了解Enumerable.Except
方法的两个重载之间的区别,即
- 除了(IEnumerable, IEnumerable)
- 除了(IEnumerable, IEnumerable,IEqualityComparer)
显然,第一个区别是第一个重载使用默认的相等比较器,而另一个重载使用 IEqualityComparer,但我可以通过实现 IEquatable 接口(如 MSDN 文档中提到的Except
方法)来使用第一种方法获得相同的结果,那么为什么需要第二个重载?
两个原因:
-
您只能为自己的类型实现
IEquatable<T>
...而您可以为任何类型的指定IEqualityComparer<T>
,无论您是否可以自己修改它。 -
可能有多种方法可以比较相等类型,但实现
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<,>
等