Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 与#x201C;等于”;和“;SequenceEqual”;?_Linq_List_Comparison_Equals_Equality - Fatal编程技术网

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