【问题标题】:Enumerable.SequenceEqual<TSource> and EqualityComparer<T>Enumerable.SequenceEqual<TSource> 和 EqualityComparer<T>
【发布时间】:2011-08-08 22:34:50
【问题描述】:

来自MSDN

SequenceEqual(IEnumerable, IEnumerable) 方法 枚举两个源序列 并行并比较对应 使用默认相等的元素 TSource 的比较器,默认值。这 默认相等比较器,默认,是 用于比较类型的值 实施 IEqualityComparer 通用 界面。

a) 据我了解上面的引用,它暗示EqualityComparer&lt;T&gt;.Default 用于比较实现IEqualityComparer&lt;T&gt; 的类型的元素,而实际上Default 用于返回IEqualityComparer&lt;T&gt; 的特定实现要么调用IEquatable&lt;T&gt;.Equals(假设T 可分配给IEquatable&lt;T&gt;),要么调用Object.Equals

b) 引用还表明TSource 必须实现IEqualityComparer&lt;T&gt;,这是不正确的:

   static void Main(string[] args)
   {
        Test test1 = new Test();
        Test test2 = new Test();

        Test[] list1 = { test1, test2 };
        Test[] list2 = { test1, test2 };

        bool eq = list1.SequenceEqual(list2); //works
   }     

  public class Test { }

那么我是否误解了这句话试图传达的意思,或者这句话是完全错误的?

谢谢

【问题讨论】:

    标签: .net linq msdn enumerable iequalitycomparer


    【解决方案1】:

    来自MSDN

    Default 属性检查是否 类型 T 实现 System.IEquatable 接口,如果 所以,返回一个 EqualityComparer 使用该实现。 否则,它会返回一个使用 覆盖 Object.Equals 和 Object.GetHashCode 由 T 提供。

    在您的示例中,它只使用引用相等,这是引用对象的默认相等实现。

    【讨论】:

    • 嗨。在我的示例中,我并没有问平等实现是如何工作的。相反,我问的是报价是否错误,或者我是否误解了它的意思
    • 嗯,仔细看看我同意你的观点,你引文中的最后一句话看起来是错误的,充其量是误导。
    【解决方案2】:

    不是TSource 应该实现IEqualityComparer

    但是EqualityComparer&lt;T&gt;.Default 实现了IEqualityComparer

    默认相等comparer,Default,用于比较实现 IEqualityComparer 泛型接口的类型的值。

    这太容易忘记了。

    【讨论】:

      猜你喜欢
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      相关资源
      最近更新 更多