Enumerable.SequenceEqual <tsource>和EqualityComparer <t> </t> </tsource>

时间:2011-04-19 18:58:14

标签: .net linq msdn enumerable iequalitycomparer

来自MSDN

  

在   SequenceEqual(IEnumerable的,   IEnumerable)方法   枚举两个源序列   并行比较对应   使用默认相等的元素   比较器用于TSource,默认。该   默认等式比较器,默认值为   用于比较类型的值   实现的   IEqualityComparer泛型   接口

a)据我理解上面的引用,这意味着EqualityComparer<T>.Default用于比较实现IEqualityComparer<T>的类型的元素,而事实上Default用于返回特定的调用IEqualityComparer<T> {假设IEquatable<T>.Equals可分配给T)或调用IEquatable<T>

Object.Equals的实施

b)引用还表明TSource必须实现IEqualityComparer<T>,这不是真的:

   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 { }

所以我误解了引用所传达的内容或引用的错误是什么?

谢谢

2 个答案:

答案 0 :(得分:2)

来自MSDN

  

Default属性检查是否   type T实现了   System.IEquatable接口和if   所以,返回一个EqualityComparer   使用该实现。   否则,它返回一个使用的EqualityComparer   覆盖Object.Equals和   由T。

提供的Object.GetHashCode

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

答案 1 :(得分:2)

TSource应该实施IEqualityComparer

但是EqualityComparer<T>.Default实现了IEqualityComparer

  

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

这太过于遗忘而无法被提及。