Не було, не є і не може бути, принаймні я б так повірив. Причиною тому, що рівність колекції є, мабуть, визначена користувачем поведінка.
Елементи в колекціях не повинні бути в певному порядку, хоча вони мають впорядкування природно, це не те, на що слід покладатися алгоритми порівняння. Скажімо, у вас є дві колекції:
{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
це досить добре, але він повертає помилку в наступному випадку:
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
? Питання неоднозначне.