是否存在以下情况:
Equals(MyList1, MyList2) != MyList1.SequenceEqual(MyList2);
之间有什么区别:
Equals(obj1, obj2)
和obj1.Equals(obj2)
感谢。
答案 0 :(得分:22)
Equals
和true
是同一个实例时, 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>
类型,Equals
和SequenceEqual
将测试以下条件:
如果X
和Y
引用相同的对象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)
为假。