“Equals”和“SequenceEqual”之间的区别?

时间:2012-05-09 06:53:11

标签: linq list comparison equals equality

是否存在以下情况:

Equals(MyList1, MyList2) != MyList1.SequenceEqual(MyList2);

之间有什么区别:

Equals(obj1, obj2)obj1.Equals(obj2)

感谢。

3 个答案:

答案 0 :(得分:22)

仅当Equalstrue是同一个实例时,

MyList1才会返回MyList2。 如果两个列表包含相同的项目,则SequenceEqual会返回true

示例:

var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 1, 2, 3 };
var list3 = list1;
var list4 = new List<int> { 1, 2, 3, 4 };

Equals(list1, list2) == false
list1.SequenceEqual(list2) == true

Equals(list1, list3) == true
list1.SequenceEqual(list3) == true

Equals(list1, list4) == false
list1.SequenceEqual(list4) == false

Equals(obj1, obj2)obj1.Equals(obj2)之间的区别在于第一个使用静态方法Object.Equals,第二个使用实例方法Equals。如果obj1类覆盖Object.Equals,则这两个调用的结果会有所不同。

答案 1 :(得分:3)

第二部分问题首先由@Daniel回答:

Equals(obj1, obj2) and obj1.Equals(obj2)

obj1.Equals(obj2)是object的实例方法,如果obj1为null,它将抛出异常。其中Equals(obj1,obj2)是静态方法,如果obj1为null,则可以使用。您还可以override Euqals获取课程

object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj1.Equals(obj2)); //print false
obj1 = null;
Console.WriteLine(obj1.Equals(obj2)); // will throw exception
Console.WriteLine(Equals(obj1, obj2));// return false in this case and since its static it will not throw the exception

答案 2 :(得分:2)

通常,Equals应该代表“永久”等价关系。如果X引用的对象报告它是Equals Y引用的对象,则前一个对象应始终报告Equals后者。一般来说,可变对象不会将自己报告为等同于其他任何东西,因为即使可变对象的状态在某个时刻与另一个对象的状态匹配,也不能保证它总是会这样做。

相比之下,

SequenceEqual表示暂时性条件。它表示的是,当它被称为时,两个对象的枚举将报告相同的项目序列。它没有对物体的过去,现在或未来状态作出任何其他承诺。

如果所有对象都是List<string>类型,EqualsSequenceEqual将测试以下条件:

  • 如果XY引用相同的对象X.Equals(Y)X.SequenceEqual(Y)只要这些引用存在且两者都没有指向,则两者都为真另一个对象。

  • 如果他们引用包含相同项目的不同列表,则X.Equals(Y)将为false,但X.SequenceEqual(Y)将为true;请注意,如果对一个或两个列表进行了更改,X.SequenceEqual(Y)可能会变为false。

  • 如果他们引用包含不同商品的不同商家信息,则X.Equals(Y)X.SequenceEquals(Y)都将为false。如果对一个或两个列表进行了更改,X.SequenceEquals(Y)可能会成立,但X.Equals(Y)不能。

除非以线程不安全的方式使用列表(在这种情况下所有的注意都被关闭),或者一个列表中有一个不遵守标准Equals合同的对象列表,否则无法{ {1}}可以为真,但X.Equals(Y)为假。