En azından ben inanırdım, değil ve olmayabilir de. Bunun nedeni, koleksiyon eşitliğinin muhtemelen kullanıcı tanımlı bir davranıştır.
Koleksiyonlardaki öğelerin doğal bir sıralaması olmasına rağmen belirli bir sıraya sahip olmaları gerekmez, karşılaştırma algoritmalarının güvenmesi gereken şey bu değildir. İki koleksiyonunuz olduğunu varsayalım:
{1, 2, 3, 4}
{4, 3, 2, 1}
Eşit mi, değil mi? Bilmelisin ama senin bakış açının ne olduğunu bilmiyorum.
Algoritmalar sıralama kurallarını sağlayana kadar koleksiyonlar varsayılan olarak kavramsal olarak sıralanmamıştır. SQL sunucusunun dikkatinize getireceği şey, sayfalandırma yapmaya çalıştığınızda, sıralama kuralları sağlamanızı gerektirir:
https://docs.microsoft.com/en-US/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
Yine iki koleksiyon daha var:
{1, 2, 3, 4}
{1, 1, 1, 2, 2, 3, 4}
Yine eşitler mi değiller mi? Sen söyle ..
Bir koleksiyonun öğe tekrarlanabilirliği, farklı senaryolarda rolünü oynar ve Dictionary<TKey, TValue>tekrarlanan öğelere bile izin verme gibi bazı koleksiyonlar .
Bu tür eşitliklerin uygulama tarafından tanımlandığını ve bu nedenle çerçevenin tüm olası uygulamaları sağlamadığını düşünüyorum.
Genel durumlarda Enumerable.SequenceEqualyeterince iyidir, ancak aşağıdaki durumda yanlış döndürür:
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
Bu gibi sorulara bazı cevaplar okudum ( onlar için google olabilir ) ve genel olarak ne kullanacağımı:
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);
}
}
Bu, bir koleksiyonun, orijinal siparişi hesaba katmadan tekrarlanan süreler dahil olmak üzere öğelerinde diğerini temsil ettiği anlamına gelir. Uygulamanın bazı notları:
GetHashCode()sadece eşitlik için değil düzen için; Bence bu durumda yeterli
Count() koleksiyonu gerçekten numaralandırmayacak ve doğrudan mülk uygulamasına düşmeyecek ICollection<T>.Count
Referanslar eşitse, sadece Boris
IListmi? Soru belirsiz.