Разница между "равными" и "SequenceEqual"?

Есть ли случаи, когда:

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

И в чем разница между:

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

Спасибо.

Ответ 1

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.

Ответ 2

За вторую часть вопроса, на который первым ответил @Daniel:

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

obj1.Equals(obj2) - метод экземпляра объекта, и он будет генерировать исключение, если obj1 имеет значение null. Где в качестве Equals (obj1, obj2) является статическим методом и будет работать, если вы obj1 равно null. Вы также можете переопределить 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

Ответ 3

В общем случае Equals предполагается представлять "постоянное" отношение эквивалентности. Если объект, на который ссылается X, сообщает, что он Equals объект, на который ссылается Y, тогда прежний объект должен всегда сообщать, что он Equals последний. Как правило, изменяемые объекты не сообщают о себе как эквиваленте чего-либо, кроме самих себя, потому что даже если состояние изменчивого объекта совпадает с состоянием другого в определенный момент времени, нет гарантии, что он всегда это сделает.

SequenceEqual, напротив, представляет собой переходное условие. Все это указывает, будет ли в момент его вызова перечисление обоих объектов сообщать о той же последовательности элементов. Это не дает никаких других обещаний о прошлом, настоящем или будущем состоянии объектов.

Если все объекты имеют тип List<string>, Equals и SequenceEqual будут тестировать следующие условия:

  • Если 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) может стать истинным, но X.Equals(Y) не может.

Если список не используется в потокобезопасном режиме (в этом случае все ставки отключены), либо у одного есть список объектов, которые не соответствуют стандарту Equals, нет способа, чтобы X.Equals(Y) может быть истинным, но X.SequenceEquals(Y) false.

Ответ 4

SequenceEqual возвращает true, если оба списка содержат одинаковые элементы. @Даниэль Хилгарт Будет ли он рассматривать данные в двух списках для сравнения. Если данные не совпадают, и данные не совпадают, то он вернет false. Список list1 = {1,2,3} Список list2 = {1,2,4} что он вернет?

List<int> list1 = {1,2,3} List<int> list2 = {1,2,3,4} что он вернет?