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

时间:2014-12-11 11:42:00

标签: c# linq except iequalitycomparer

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

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

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

1 个答案:

答案 0 :(得分:11)

有两个原因:

  1. 您只能为自己的类型实施IEquatable<T> ...而您可以为任何类型指定IEqualityComparer<T>,无论您是自己修改还是不

  2. 可能有多种方法可以比较类型的相等性,但实现IEquatable<T>只允许您表达其中一种。

  3. 所有这一切的一个简单例子是字符串 - 考虑:

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