Linq 与#x201C;等于”;和“;SequenceEqual”;?
是否存在以下情况:Linq 与#x201C;等于”;和“;SequenceEqual”;?,linq,list,comparison,equals,equality,Linq,List,Comparison,Equals,Equality,是否存在以下情况: Equals(MyList1, MyList2) != MyList1.SequenceEqual(MyList2); 以下两者之间的区别是什么: Equals(obj1,obj2)和obj1.Equals(obj2) 谢谢。Equals仅当MyList1和MyList2是相同的实例时,才会返回true。 SequenceEqual如果两个列表包含相同的项,则返回true 例如: var list1 = new List<int> { 1, 2, 3 }; va
Equals(MyList1, MyList2) != MyList1.SequenceEqual(MyList2);
以下两者之间的区别是什么:
Equals(obj1,obj2)
和obj1.Equals(obj2)
谢谢。
Equals
仅当MyList1
和MyList2
是相同的实例时,才会返回true
。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
var list1=新列表{1,2,3};
var list2=新列表{1,2,3};
var list3=list1;
var list4=新列表{1,2,3,4};
等于(列表1,列表2)=false
list1.SequenceEqual(list2)=真
等于(列表1,列表3)=真
list1.SequenceEqual(list3)=真
等于(列表1,列表4)=false
list1.SequenceEqual(list4)=false
Equals(obj1,obj2)
和obj1.Equals(obj2)
之间的区别在于第一个使用静态方法,第二个使用实例方法Equals
。如果问题的第二部分的obj1
类覆盖了Object.Equals
,则这两个调用的结果将不同,因为第一部分已由@Daniel回答:
Equals(obj1, obj2) and obj1.Equals(obj2)
Equals(obj2)是对象的实例方法,如果obj1为空,它将抛出异常。其中as Equals(obj1,obj2)是静态方法,如果您的obj1为空,它将起作用。你也可以去上课
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
一般来说,
等于
应该表示一种“永久”的等价关系。如果由X
引用的对象报告其等于由Y引用的对象,则前一个对象应始终报告其等于后者。一般来说,可变对象不会将自己报告为等同于其他对象,而只报告自己,因为即使可变对象的状态在某个时刻与另一个对象的状态匹配,也不能保证它总是这样做。
相反,SequenceEqual表示一种暂时性条件。它只指示在调用时,两个对象的枚举是否将报告相同的项序列。它对对象的过去、现在或未来状态没有其他承诺
如果所有对象的类型均为List
,Equals
和SequenceEqual
将测试以下条件:
- 如果
X
和Y
引用同一个对象X.Equals(Y)
和X.SequenceEqual(Y)
只要这些引用存在且都没有指向另一个对象,它们都将为真
- 如果它们引用包含相同项的不同列表,
X.Equals(Y)
将为false,但X.Equals(Y)
将为true;请注意,如果对一个或两个列表进行了更改,X.SequenceEqual(Y)
可能会变为false
- 如果它们引用包含不同项目的不同列表,则
X.Equals(Y)
和X.SequenceEquals(Y)
都将为false。如果对一个或两个列表进行了更改,X.SequenceEquals(Y)
可能变为真,但X.Equals(Y)
不能
除非列表以线程不安全的方式使用(在这种情况下,所有赌注都被取消),或者一个人有一个不遵守标准Equals
contract的对象列表,否则X.Equals(Y)
不可能是真的,但X.SequenceEquals(Y)
false