Arrays.equals()
Ermöglicht in Java den einfachen Vergleich des Inhalts von zwei Basisarrays (Überladungen sind für alle Basistypen verfügbar).
Gibt es so etwas in C #? Gibt es eine "magische" Möglichkeit, den Inhalt von zwei Arrays in C # zu vergleichen?
Antworten:
Sie könnten verwenden
Enumerable.SequenceEqual
. Dies funktioniert für alleIEnumerable<T>
Arrays, nicht nur für Arrays.quelle
SequenceEqual
In Bezug auf die Leistung ist dies möglicherweise keine gute Wahl, da die aktuelle Implementierung möglicherweise eine der Quellen vollständig auflistet, wenn sie sich nur durch die Länge unterscheiden. Mit Arrays könnten wir zuerst dieLength
Gleichheit überprüfen , um zu vermeiden, dass Arrays unterschiedlicher Länge aufgelistet werden, um am Ende eine Ausbeute zu erzielenfalse
.Verwendung
Enumerable.SequenceEqual
in LINQ .quelle
new int[] {1}.SequenceEquals(null) == false
Auch für Arrays (und Tupel) können Sie neue Schnittstellen aus .NET 4.0 verwenden: IStructuralComparable und IStructuralEquatable . Mit ihnen können Sie die Gleichheit von Arrays nicht nur überprüfen, sondern auch vergleichen.
quelle
a.StructuralCompare(b)
?Für .NET 4.0 und höher können Sie Elemente in Arrays oder Tupeln mithilfe des StructuralComparisons- Typs vergleichen:
quelle
SequenceEqual
wird nur dann true zurückgeben, wenn zwei Bedingungen erfüllt sind.Wenn Sie nur überprüfen möchten, ob sie unabhängig von ihrer Reihenfolge dieselben Elemente enthalten und Ihr Problem vom Typ ist
Sie können die LINQ-Erweiterungsmethode verwenden
Enumerable.Except
und dann prüfen, ob das Ergebnis einen Wert hat. Hier ist ein BeispielUnd auch wenn Sie dies verwenden, erhalten Sie die verschiedenen Elemente automatisch. Zwei Fliegen mit einer Klappe.
Denken Sie daran, wenn Sie Ihren Code so ausführen
Sie erhalten unterschiedliche Ergebnisse.
In meinem Fall habe ich eine lokale Kopie eines Arrays und möchte überprüfen, ob etwas aus dem ursprünglichen Array entfernt wurde, also verwende ich diese Methode.
quelle
Für Unit-Tests können Sie
CollectionAssert.AreEqual
anstelle von verwendenAssert.AreEqual
.Es ist wahrscheinlich der einfachste Weg.
quelle
Wenn Sie
null
Eingaben ordnungsgemäß verarbeiten und die Reihenfolge der Elemente ignorieren möchten , versuchen Sie die folgende Lösung:Der Testcode sieht folgendermaßen aus:
quelle
a1 = { 1, 1 }
unda2 = { 1, 2 }
, dann liefert der erste Test das falsche Ergebnis. Die Rückgabeerklärung sollte lautenreturn array1.Count() == array2.Count() && !array1.Except(array2).Any() && !array2.Except(array1).Any();
Für einige Anwendungen kann besser sein:
quelle
Diese LINQ-Lösung funktioniert, nicht sicher, wie sie in ihrer Leistung mit SequenceEquals verglichen wird. Es werden jedoch unterschiedliche Array-Längen verarbeitet, und .All wird für das erste Element beendet, das nicht gleich ist, ohne das gesamte Array zu durchlaufen.
quelle
elementweise vergleichen? wie wäre es mit
Ersetzen Sie die Bedingung (a == b) durch alles, was Sie in a und b vergleichen möchten.
(Dies kombiniert zwei Beispiele aus MSDN-Entwickler-Linq-Beispielen. )
quelle
true
) undnull
Arrays (Absturz) verarbeitet.Ich habe das in visuellen Studios gemacht und es hat perfekt funktioniert; Vergleichen von Arrays Index für Index mit Kurzschluss dieses Codes.
die Ausgabe wird sein; Die übereinstimmenden Nummern sind 7 Die nicht übereinstimmenden Nummern sind 3
quelle
null
Arrays (stürzt auch ab) und es tut etwas anderes als das, was das OP verlangt hat. Er fragte nur nach Gleichheit, ohne zu zählen, wie viele Gegenstände sich unterscheiden oder übereinstimmen.Unter der Annahme, dass Array-Gleichheit bedeutet, dass beide Arrays gleiche Elemente bei gleichen Indizes haben, gibt es die
SequenceEqual
Antwort und dieIStructuralEquatable
Antwort .Aber beide haben leistungsbedingte Nachteile.
SequenceEqual
Die aktuelle Implementierung wird keine Verknüpfung herstellen, wenn die Arrays unterschiedliche Längen haben. Daher wird möglicherweise eines davon vollständig aufgelistet und jedes seiner Elemente verglichen.IStructuralEquatable
ist nicht generisch und kann zum Boxen jedes verglichenen Wertes führen. Darüber hinaus ist die Verwendung nicht sehr einfach und erfordert bereits die Codierung einiger Hilfsmethoden, die es verbergen.In Bezug auf die Leistung ist es möglicherweise besser, Folgendes zu verwenden:
Aber das ist natürlich auch keine "magische Art", die Array-Gleichheit zu überprüfen.
Nein, derzeit gibt es
Arrays.equals()
in .Net kein wirkliches Äquivalent zu Java .quelle
null
. Worum geht es dir?