我试图理解Enumerable.Except
方法的两个重载之间的区别,即
显然,第一个不同之处在于第一个重载使用默认的相等比较器,而另一个使用IEqualityComparer,但我可以通过实现IEquatable接口实现与第一个方法相同的结果(如Except
方法的MSDN文档中所述,那么为什么需要第二次重载?
答案 0 :(得分:11)
有两个原因:
您只能为自己的类型实施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<,>
等。