我试图理解 Enumerable.Except
方法的两个重载之间的区别,即
- 除了(IEnumerable,IEnumerable)
- 除了(IEnumerable,IEnumerable, IEqualityComparer)
显然,第一个区别是第一个重载使用默认的相等比较器,而另一个使用 IEqualityComparer。 , 但我可以用第一种方法实现相同的结果,方法是实现 IEquatable接口(interface)(如 Except
方法的 MSDN 文档中所述),那么为什么需要第二次重载?
最佳答案
两个原因:
你只能实现
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<,>
等
关于c# - Enumerable.Except 的两个重载之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27422060/