[英]Difference between two overloads of Enumerable.Except?
我试图理解Enumerable.Except
方法的两个重载之间的区别,即
显然,第一个区别是第一个重载使用默认的相等比较器,而另一个重载使用IEqualityComparer ,但是我可以通过实现IEquatable接口(如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>
处理这两个结果,而且IEquatable<T>
我们都无法更改string
实现IEquatable<T>
的方式。 (当然,您不限于StringComparer
,您可以编写一个相等比较器,例如,仅使用字符串的长度。)
这也不是LINQ特有的-任何平等处理的API都是这种情况,例如HashSet<>
, Dictionary<,>
等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.