Il n'y en avait pas, il n'y en a pas et peut-être pas, du moins je le croirais. La raison derrière est que l'égalité des collections est probablement un comportement défini par l'utilisateur.
Les éléments des collections ne sont pas censés être dans un ordre particulier bien qu'ils aient un ordre naturellement, ce n'est pas sur quoi les algorithmes de comparaison devraient s'appuyer. Supposons que vous ayez deux collections de:
{1, 2, 3, 4}
{4, 3, 2, 1}
Sont-ils égaux ou non? Vous devez savoir mais je ne sais pas quel est votre point de vue.
Les collections sont conceptuellement non ordonnées par défaut, jusqu'à ce que les algorithmes fournissent les règles de tri. La même chose que le serveur SQL portera à votre attention est que lorsque vous essayez de faire la pagination, il vous oblige à fournir des règles de tri:
https://docs.microsoft.com/en-US/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
Encore deux autres collections:
{1, 2, 3, 4}
{1, 1, 1, 2, 2, 3, 4}
Encore une fois, sont-ils égaux ou non? À vous de me dire ..
La répétabilité des éléments d'une collection joue son rôle dans différents scénarios et certaines collections comme Dictionary<TKey, TValue>
ne permettent même pas les éléments répétés.
Je pense que ces types d'égalité sont définis par l'application et que le cadre ne fournit donc pas toutes les implémentations possibles.
Eh bien, dans les cas généraux, Enumerable.SequenceEqual
c'est assez bon mais il renvoie faux dans le cas suivant:
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));
J'ai lu quelques réponses à des questions comme celle-ci (vous pouvez google pour eux) et ce que j'utiliserais, en général:
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);
}
}
Cela signifie qu'une collection représente l'autre dans ses éléments, y compris des temps répétés sans tenir compte de la commande d'origine. Quelques notes de la mise en œuvre:
GetHashCode()
est juste pour l'ordre et non pour l'égalité; Je pense que c'est suffisant dans ce cas
Count()
n'énumère pas vraiment la collection et tombe directement dans l'implémentation de propriété de ICollection<T>.Count
Si les références sont égales, c'est juste Boris
IList
? La question est ambiguë.