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