Es gab, gibt und gibt es nicht, zumindest würde ich das glauben. Der Grund dafür ist, dass die Gleichheit der Sammlung wahrscheinlich ein benutzerdefiniertes Verhalten ist.
Elemente in Sammlungen sollten nicht in einer bestimmten Reihenfolge sein, obwohl sie natürlich eine Reihenfolge haben. Darauf sollten sich die Vergleichsalgorithmen nicht stützen. Angenommen, Sie haben zwei Sammlungen von:
{1, 2, 3, 4}
{4, 3, 2, 1}
Sind sie gleich oder nicht? Sie müssen wissen, aber ich weiß nicht, was Ihre Sichtweise ist.
Sammlungen sind standardmäßig konzeptionell ungeordnet, bis die Algorithmen die Sortierregeln bereitstellen. Wenn Sie versuchen, eine Paginierung durchzuführen, werden Sie auf SQL Server aufmerksam gemacht. Dazu müssen Sie Sortierregeln angeben:
https://docs.microsoft.com/en-US/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
Noch zwei Sammlungen:
{1, 2, 3, 4}
{1, 1, 1, 2, 2, 3, 4}
Sind sie wieder gleich oder nicht? Du sagst es mir ..
Die Wiederholbarkeit von Elementen einer Sammlung spielt in verschiedenen Szenarien eine Rolle, und einige Sammlungen Dictionary<TKey, TValue>
erlauben nicht einmal wiederholte Elemente.
Ich glaube, diese Art der Gleichstellung ist anwendungsdefiniert und der Rahmen bot daher nicht alle möglichen Implementierungen.
Nun, im Allgemeinen sind Fälle Enumerable.SequenceEqual
gut genug, aber im folgenden Fall wird false zurückgegeben:
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
Ich habe einige Antworten auf Fragen wie diese gelesen (Sie können sie googeln ) und was ich im Allgemeinen verwenden würde:
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);
}
}
Das heißt, eine Sammlung repräsentiert die andere in ihren Elementen, einschließlich wiederholter Zeiten, ohne die ursprüngliche Bestellung zu berücksichtigen. Einige Hinweise zur Implementierung:
GetHashCode()
ist nur für die Bestellung nicht für die Gleichheit; Ich denke es ist genug in diesem Fall
Count()
wird die Sammlung nicht wirklich aufzählen und direkt in die Eigenschaftsimplementierung von fallen ICollection<T>.Count
Wenn die Referenzen gleich sind, ist es nur Boris
IList
? Die Frage ist nicht eindeutig.