Tidak ada, tidak dan mungkin tidak, setidaknya saya akan percaya begitu. Alasan di baliknya adalah kesetaraan koleksi mungkin merupakan perilaku yang ditentukan pengguna.
Elemen dalam koleksi tidak seharusnya dalam urutan tertentu meskipun mereka memiliki pemesanan secara alami, itu bukan apa yang harus mengandalkan algoritma pembanding. Katakanlah Anda memiliki dua koleksi:
{1, 2, 3, 4}
{4, 3, 2, 1}
Apakah mereka setara atau tidak? Anda harus tahu tetapi saya tidak tahu apa sudut pandang Anda.
Koleksi secara konsep tidak teratur secara default, hingga algoritme menyediakan aturan penyortiran. Hal yang sama dengan SQL server akan menarik perhatian Anda adalah ketika Anda mencoba melakukan pagination, itu mengharuskan Anda untuk memberikan aturan penyortiran:
https://docs.microsoft.com/en-US/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
Dua koleksi lagi:
{1, 2, 3, 4}
{1, 1, 1, 2, 2, 3, 4}
Sekali lagi, apakah mereka setara atau tidak? Katakan pada saya ..
Pengulangan elemen koleksi memainkan perannya dalam skenario yang berbeda dan beberapa koleksi seperti Dictionary<TKey, TValue>
bahkan tidak memungkinkan elemen berulang.
Saya percaya jenis kesetaraan ini adalah aplikasi yang ditentukan dan oleh karena itu kerangka kerjanya tidak menyediakan semua kemungkinan implementasi.
Nah, dalam kasus umum Enumerable.SequenceEqual
cukup baik tetapi mengembalikan false dalam kasus berikut:
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
Saya membaca beberapa jawaban untuk pertanyaan seperti ini (Anda dapat menggunakan google untuk itu) dan apa yang akan saya gunakan, secara umum:
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);
}
}
Itu berarti satu koleksi mewakili yang lain dalam elemen mereka termasuk waktu yang berulang tanpa memperhitungkan urutan aslinya. Beberapa catatan implementasi:
GetHashCode()
hanya untuk pemesanan bukan untuk kesetaraan; Saya pikir sudah cukup dalam hal ini
Count()
tidak akan benar - benar menyebutkan koleksi dan langsung jatuh ke dalam implementasi properti ICollection<T>.Count
Jika referensi sama, itu hanya Boris
IList
? Pertanyaan tidak jelas.