Sie vergleichen das Array Referenzen und nicht deren Inhalt. ya
und yb
beziehen sich auf verschiedene Arrays. Wenn Sie den Inhalt der Arrays überprüfen möchten, müssen Sie dies explizit tun.
Ich glaube nicht da ist irgendetwas in das Framework eingebaut, um das für Sie zu tun, fürchte ich. So etwas sollte jedoch funktionieren:
%Vor%Nebenbei bemerkt, Ihre Strukturen sind insofern veränderbar, als der Array-Inhalt nach der Erstellung der Struktur geändert werden kann. Brauchst du das wirklich als Struktur?
BEARBEITEN: Wie Nick in den Kommentaren erwähnt hat, solltest du GetHashCode auch wirklich überschreiben. Auch hier müssen Sie die Inhalte von den Arrays abrufen (und dies wiederum führt zu Problemen, wenn die Arrays später geändert werden). Ähnliche Hilfsmethode:
%Vor%Sie sollten den Inhalt des Arrays in Ihrer Gleichheitslogik vergleichen ...
Außerdem wird empfohlen, dass Sie die Schnittstelle IEquatable<T>
auf Ihrer Struktur implementieren, z Dies verhindert in einigen Fällen Boxing / Unboxing-Probleme.
Ссылка
Ich glaube nicht, dass irgendetwas in den Rahmen eingebaut ist, um das für Sie zu tun, fürchte ich
In 4.0 gibt es:
%Vor% Der Teil s1.Y == s2.Y
prüft, ob es sich um zwei Referenzen auf die gleiche Array-Instanz handelt, nicht, wenn der Inhalt gleich ist. Trotz des Titels handelt es sich bei dieser Frage eigentlich um die Gleichheit zwischen Array (Referenz) s.
Einige zusätzliche Ratschläge: Da Sie überladen sind, sollten Sie entwerfen Serie<>
als unveränderlich und wegen des eingebetteten Arrays würde ich es zu einer Klasse anstatt einer Struktur machen.
Aufruf von ==
führt Referenzgleichheit für Arrays aus - sie vergleichen nicht den Inhalt ihrer Elemente. Das bedeutet im Grunde, dass a1 == a2
nur dann true zurückgibt, wenn die exakt gleiche -Instanz - was Sie nicht wollen, denke ich ..
Sie müssen Ihre operator ==
ändern, um den Inhalt des x
-Arrays zu vergleichen, nicht den Referenzwert.
Wenn Sie .NET 3.5 (mit Link) verwenden, können Sie Folgendes tun:
%Vor% Wenn Sie einen tiefen Vergleich (über Referenzen hinaus) durchführen müssen, können Sie SequenceEquals
mit einem benutzerdefinierten IEqualityComparer
für den Typ von T angeben.
Sie sollten wahrscheinlich auch überlegen, die Schnittstelle IEquatable<T>
für Ihre Struktur zu implementieren. Es wird Ihrem Code dabei helfen, besser mit LINQ und anderen Teilen des .NET-Frameworks zu arbeiten, die Objektvergleiche durchführen.
Tags und Links c#