Не было, нет и не может быть, по крайней мере, я бы поверил в это. Причина заключается в том, что равенство коллекций, вероятно, определяется пользователем.
Элементы в коллекциях не должны быть в определенном порядке, хотя они имеют естественный порядок, это не то, на что должны опираться алгоритмы сравнения. Скажем, у вас есть две коллекции:
{1, 2, 3, 4}
{4, 3, 2, 1}
Они равны или нет? Вы должны знать, но я не знаю, какова ваша точка зрения.
Коллекции концептуально неупорядочены по умолчанию, пока алгоритмы не предоставят правила сортировки. То же самое, что SQL-сервер предлагает вашему вниманию, когда вы пытаетесь сделать нумерацию страниц, вам необходимо предоставить правила сортировки:
https://docs.microsoft.com/en-US/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
Еще две коллекции:
{1, 2, 3, 4}
{1, 1, 1, 2, 2, 3, 4}
Опять они равны или нет? Кому ты рассказываешь ..
Повторяемость элементов коллекции играет свою роль в различных сценариях, и некоторые коллекции, например Dictionary<TKey, TValue>
, даже не допускают повторения элементов.
Я полагаю, что эти виды равенства определяются приложением, и поэтому структура не обеспечивает всех возможных реализаций.
Ну, в общем случае Enumerable.SequenceEqual
это достаточно хорошо, но возвращает false в следующем случае:
var a = new Dictionary<String, int> { { "2", 2 }, { "1", 1 }, };
var b = new Dictionary<String, int> { { "1", 1 }, { "2", 2 }, };
Debug.Print("{0}", a.SequenceEqual(b)); // false
Я прочитал некоторые ответы на такие вопросы (вы можете Google для них) и что бы я использовал, в целом:
public static class CollectionExtensions {
public static bool Represents<T>(this IEnumerable<T> first, IEnumerable<T> second) {
if(object.ReferenceEquals(first, second)) {
return true;
}
if(first is IOrderedEnumerable<T> && second is IOrderedEnumerable<T>) {
return Enumerable.SequenceEqual(first, second);
}
if(first is ICollection<T> && second is ICollection<T>) {
if(first.Count()!=second.Count()) {
return false;
}
}
first=first.OrderBy(x => x.GetHashCode());
second=second.OrderBy(x => x.GetHashCode());
return CollectionExtensions.Represents(first, second);
}
}
Это означает, что одна коллекция представляет другую в своих элементах, включая повторяющиеся моменты времени без учета первоначального порядка. Некоторые замечания о реализации:
GetHashCode()
только для заказа, а не для равенства; Я думаю, что в этом случае достаточно
Count()
на самом деле не будет перечислять коллекцию и напрямую попадет в свойство реализации ICollection<T>.Count
Если ссылки равны, это просто Борис
IList
? Вопрос неоднозначный.