c # Vergleichen Sie die Daten in zwei Objektmodellen

8

Ich habe einen Dialog, wenn er erzeugt wird, wird er mit den Daten in einem Objektmodell gefüllt. Zu diesem Zeitpunkt werden die Daten kopiert und in einem "Backup" -Objektmodell gespeichert. Wenn der Benutzer seine Änderungen abgeschlossen hat und auf "OK" klickt, um den Dialog zu schließen, brauche ich eine schnelle Möglichkeit, das Backup-Objektmodell mit dem Live-Modell zu vergleichen. Wenn etwas geändert wird, kann ich dem Benutzer einen neuen Undo-Status erstellen / p>

Ich möchte nicht, wenn möglich, Vergleichsfunktionen für jede einzelne Klasse im Objektmodell schreiben.

Wenn ich beide Objektmodelle serialisierte und sie identisch waren, aber an verschiedenen Speicherorten gespeichert waren, wären sie gleich? Gibt es eine einfache Möglichkeit, zwei serialisierte Objektmodelle zu vergleichen?

    
DrLazer 06.01.2011, 15:35
quelle

3 Antworten

11

Ich habe mich nicht mit einer Hash-Zeichenfolge beschäftigt, aber nur eine geradlinige binäre Serialisierung wirkt Wunder. Wenn das Dialogfeld geöffnet wird, serialisieren Sie das Objektmodell.

%Vor%

Wenn der Benutzer dann das Objektmodell mit verfügbaren Steuerelementen hinzufügt (oder nicht). Wenn das Dialogfeld geschlossen wird, können Sie mit der ursprünglichen Serialisierung mit einer neuen vergleichen - das ist für mich, wie ich entscheiden kann, ob ein Rückgängig-Status erforderlich ist oder nicht.

%Vor%

Und die Vergleichs-Arrays funktionieren, wenn irgendjemand es braucht - wahrscheinlich nicht der beste Weg, um zwei Arrays zu vergleichen.

%Vor%     
DrLazer 17.01.2011, 14:57
quelle
6

Ich würde sagen, der beste Weg besteht darin, die Gleichheitsoperatoren für alle Klassen in Ihrem Modell zu implementieren (was normalerweise eine gute Idee ist, wenn Sie Vergleiche anstellen wollen).

%Vor%

Dieses Snippet wird von ReSharper automatisch generiert, Sie können dies jedoch als Grundlage verwenden. Grundsätzlich müssen Sie die nicht überschreibende Equals-Methode mit Ihrer benutzerdefinierten Vergleichslogik erweitern.

Sie können beispielsweise SequenceEquals von den Linq-Erweiterungen verwenden, um zu prüfen, ob die Kapitelsammlung der Reihe nach gleich ist.

Vergleichen Sie zwei Bücher jetzt so einfach wie sagen:

%Vor%

Beachten Sie, dass es eine andere Möglichkeit gibt, die Gleichheit zu implementieren: das System.IEquatable , das wird von verschiedenen Klassen im Namespace System.Collections zum Bestimmen der Gleichheit verwendet.

Ich würde sagen, überprüfen Sie das auch und Sie sind auf dem besten Weg!

    
Erik van Brakel 06.01.2011 15:46
quelle
2

Ich verstehe Ihre Frage so, wie man zwei Objekte für die Gleichheit der Werte (im Gegensatz zur Referenzgleichheit) ohne vorherige Kenntnis der Typen vergleichen kann, etwa wenn sie IEquatable oder Equals implementieren.

Um dies zu tun, empfehle ich zwei Optionen:

A. Verwenden Sie eine Allzweck-Serialisierungsklasse, um beide Objekte zu serialisieren und ihren Wert zu vergleichen. Zum Beispiel habe ich eine Klasse namens XmlSerializer, die jedes Objekt übernimmt und seine öffentlichen Eigenschaften als XML-Dokument serialisiert. Zwei Objekte, die die gleichen Werte und möglicherweise die gleiche Referenz haben, haben in diesem Sinne die gleichen Werte.

B. Vergleichen Sie mit reflection die Werte aller Eigenschaften beider Objekte, beispielsweise:

%Vor%

Hier nehmen wir an, dass wir die Eigenschaften leicht vergleichen können, wenn sie alle IConvertible implementieren oder ToString korrekt überschreiben. Wenn das nicht der Fall ist, würde ich prüfen, ob sie IConvertible implementieren, und wenn nicht, rekursiv Equal () für die Eigenschaften aufrufen.

Dies funktioniert nur, wenn Sie mit dem Vergleich öffentlicher Eigenschaften zufrieden sind. Natürlich könntest du auch private und geschützte Felder und Eigenschaften überprüfen, aber wenn du so wenig über die Objekte weißt, fragst du wahrscheinlich nach Ärger, aber tust du.

    
Yvan 11.01.2011 20:01
quelle

Tags und Links