【问题标题】:Difference between two overloads of Enumerable.Except?Enumerable.Except 的两个重载之间的区别?
【发布时间】:2015-02-09 21:21:54
【问题描述】:

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

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

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

【问题讨论】:

  • 好吧,仅适用于由于某种原因无法实现IEquatable 接口的情况(例如 - 如果它不是您的类),但仍想使用自定义比较器。
  • 可能你想在2IEnuemrable<SomeThirdPartyClass>上使用但不能修改SomeThirdPartyClass,那么你必须使用第二个重载。
  • 有时有几个适用于对象的相等规则,具体取决于上下文。 IEquatable 确实提供了一种用例,因此在这些情况下,您需要定义替代比较器,以及 Except 的第二个重载。

标签: c# linq except iequalitycomparer


【解决方案1】:

两个原因:

  1. 你只能为你自己的类型实现IEquatable<T>...而你可以为any类型指定一个IEqualityComparer<T>,不管你是否可以自己修改。 p>

  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<,>等

【讨论】:

  • 谢谢乔恩!解释得很好:)
猜你喜欢
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多