20

是否有以下情况:

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

和有什么区别:

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

谢谢。

4

3 回答 3

38

Equalstrue仅当MyList1MyList2是相同的实例时才返回。如果两个列表包含相同的项目,则
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,第二个使用实例方法Equalsobj1如果覆盖类,这两个调用的结果会有所不同Object.Equals

于 2012-05-09T06:57:24.980 回答
4

对于@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
于 2012-05-09T07:08:55.670 回答
2

通常,Equals应该表示“永久”等价关系。如果被引用的对象X报告它Equals是由 Y 引用的对象,那么前一个对象应该总是报告它Equals是后者。通常,可变对象不会将自己报告为除自身以外的任何事物,因为即使可变对象的状态在某个时刻与另一个对象的状态匹配,也不能保证它总是如此。

相反,SequenceEqual 表示暂时的条件。它所表明的只是,在调用它时,两个对象的枚举是否会报告相同的项目序列。它不对对象的过去、现在或未来状态做出任何其他承诺。

如果所有对象都是 type List<string>Equals并且SequenceEqual将 test 测试以下条件:

  • 如果XY引用同一个对象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)真假。

于 2013-09-16T16:37:55.743 回答