Non c'era, non è e potrebbe non esserlo, almeno ci crederei. Il motivo dietro l'uguaglianza di raccolta è probabilmente un comportamento definito dall'utente.
Gli elementi nelle raccolte non dovrebbero essere in un ordine particolare sebbene abbiano un ordinamento naturale, non è ciò su cui gli algoritmi di confronto dovrebbero fare affidamento. Supponi di avere due raccolte di:
{1, 2, 3, 4}
{4, 3, 2, 1}
Sono uguali o no? Devi sapere ma non so quale sia il tuo punto di vista.
Le raccolte sono concettualmente non ordinate per impostazione predefinita, fino a quando gli algoritmi non forniscono le regole di ordinamento. La stessa cosa che SQL Server porterà alla tua attenzione è quando provi a fare l'impaginazione, ti richiede di fornire regole di ordinamento:
https://docs.microsoft.com/en-US/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
Ancora altre due collezioni:
{1, 2, 3, 4}
{1, 1, 1, 2, 2, 3, 4}
Ancora una volta, sono uguali o no? Dimmelo tu ..
La ripetibilità degli elementi di una collezione svolge il suo ruolo in diversi scenari e in alcune raccolte simili Dictionary<TKey, TValue>
non consentono nemmeno elementi ripetuti.
Credo che questi tipi di uguaglianza siano definiti dall'applicazione e il quadro pertanto non ha fornito tutte le possibili implementazioni.
Bene, in generale Enumerable.SequenceEqual
è abbastanza buono ma restituisce false nel caso seguente:
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
Ho letto alcune risposte a domande come questa (potresti google per loro) e cosa userei, in generale:
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);
}
}
Ciò significa che una raccolta rappresenta l'altra nei suoi elementi, compresi i tempi ripetuti senza tenere conto dell'ordinamento originale. Alcune note di attuazione:
GetHashCode()
è solo per l'ordinamento, non per l'uguaglianza; Penso che sia abbastanza in questo caso
Count()
non enumera realmente la raccolta e rientra direttamente nell'implementazione della proprietà di ICollection<T>.Count
Se i riferimenti sono uguali, è solo Boris
IList
? La domanda è ambigua.