Enumerable.Except的两个重载之间的区别?

Cod*_*r23 1 c# linq iequalitycomparer except

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

  • 除外(IEnumerable,IEnumerable)
  • 除外(IEnumerable,IEnumerable,IEqualityComparer)

显然,第一个不同之处在于第一个重载使用默认的相等比较器,而另一个使用IEqualityComparer,但我可以通过实现IEquatable接口(如MSDN文档中提到的Except方法)实现与第一个方法相同的结果,然后为什么需要第二次过载?

Jon*_*eet 11

两个原因:

  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);
Run Code Online (Sandbox Code Playgroud)

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

这不是专门针对LINQ,无论是-它通常用于哪些交易在平等的任何API的情况,例如HashSet<>,Dictionary<,>等等.