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

标签 c# linq except iequalitycomparer

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

  • 除了(IEnumerable,IEnumerable)
  • 除了(IEnumerable,IEnumerable, IEqualityComparer)

显然,第一个区别是第一个重载使用默认的相等比较器,而另一个使用 IEqualityComparer。 , 但我可以用第一种方法实现相同的结果,方法是实现 IEquatable接口(interface)(如 Except 方法的 MSDN 文档中所述),那么为什么需要第二次重载?

最佳答案

两个原因:

  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);

我们可能在不同的情况下需要两种结果,这意味着我们无法使用 IEquatable<T> 处理这两种结果。 ...我们无法改变string的方式工具 IEquatable<T>反正。 (当然,您不限于 StringComparer - 例如,您可以编写一个只使用字符串长度的相等比较器。)

这也不是 LINQ 特有的 - 对于处理相等性的任何 API 通常都是这种情况,例如HashSet<> , Dictionary<,>

关于c# - Enumerable.Except 的两个重载之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27422060/

相关文章:

C# + CaSTLe ActiveRecord : HasAndBelongsToMany and collections

c# - 如何将字符串数组(具有 xml 内容)转换为 XML 文件?

c# - LINQ .Take() 返回的元素多于请求的元素

c# - 我的 syncfunctions hashCode 使用方法是否正确?

python - 使用逗号时,除了处理程序中的语法无效

SQL UPDATE 具有复合主键的表中除某些行外的所有行

c# - 在 ASP.NET MVC 6 中更新 NuGet 包

c# - MVC 5 C#将错误报告回数据库

c# - 复制文件和文件夹,保留 Windows 7 界面

c# - 如何使用 let 在 LINQ 查询中定义一组新数据?