是否有以下情况:
Equals(MyList1, MyList2) != MyList1.SequenceEqual(MyList2);
和有什么区别:
Equals(obj1, obj2)
和obj1.Equals(obj2)
谢谢。
是否有以下情况:
Equals(MyList1, MyList2) != MyList1.SequenceEqual(MyList2);
和有什么区别:
Equals(obj1, obj2)
和obj1.Equals(obj2)
谢谢。
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
。
对于@Daniel首先回答的问题的第二部分:
Equals(obj1, obj2) and obj1.Equals(obj2)
obj1.Equals(obj2) 是对象的实例方法,如果 obj1 为 null,它将抛出异常。其中 Equals(obj1,obj2) 是静态方法,如果 obj1 为空,它将起作用。您还可以为一个类覆盖 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
通常,Equals
应该表示“永久”等价关系。如果被引用的对象X
报告它Equals
是由 Y 引用的对象,那么前一个对象应该总是报告它Equals
是后者。通常,可变对象不会将自己报告为除自身以外的任何事物,因为即使可变对象的状态在某个时刻与另一个对象的状态匹配,也不能保证它总是如此。
相反,SequenceEqual 表示暂时的条件。它所表明的只是,在调用它时,两个对象的枚举是否会报告相同的项目序列。它不对对象的过去、现在或未来状态做出任何其他承诺。
如果所有对象都是 type List<string>
,Equals
并且SequenceEqual
将 test 测试以下条件:
如果X
和Y
引用同一个对象X.Equals(Y)
,并且X.SequenceEqual(Y)
只要这些引用存在并且两者都没有指向另一个对象,那么两者都将为真。
如果它们引用包含相同项目的不同列表,X.Equals(Y)
则为假,但X.SequenceEqual(Y)
为真;请注意,如果对一个或两个列表进行更改,X.SequenceEqual(Y)
可能会变为错误。
如果它们引用包含不同项目的不同列表,则两者X.Equals(Y)
都是X.SequenceEquals(Y)
错误的。如果对一个或两个列表进行更改,X.SequenceEquals(Y)
可能会变为 true,但X.Equals(Y)
不会。
除非以线程不安全的方式使用列表(在这种情况下,所有赌注都关闭),或者有一个不遵守标准Equals
合约的对象列表,否则没有办法X.Equals(Y)
可以是X.SequenceEquals(Y)
真假。