Unterschiede zwischen zwei Objekten in C #

7

Ich habe mich gefragt, wie ich den Unterschied zwischen zwei Objekten derselben Klasse finden würde. Wenn ich also eine Person-Klasse mit dem einzigen Unterschied Alter hatte, würde ich das Feld / die Felder zurückgeben, die unterschiedlich sind.

Danke

    
user551481 22.12.2010, 17:15
quelle

6 Antworten

9

Dies ist nicht etwas, das C # (oder .NET wirklich) direkt unterstützt, Sie könnten jedoch etwas manuell für bestimmte Typen implementieren oder Code schreiben, der Reflektion für beliebige Objekte verwendet.

Wenn Sie das spätere auswählen, müssen Sie entscheiden, wie tief Sie in das Objektdiagramm einsteigen möchten, um festzustellen, ob zwei Instanzen identisch sind oder nicht und wie Sie bestimmte primitive Typen auf Gleichheit vergleichen (z. B. doubles).

Das Schreiben eines reflektionsbasierten Differenzierungsalgorithmus ist schwieriger, als es zunächst scheint - persönlich würde ich diese Funktionalität direkt für die Typen (oder in einer Hilfsklasse) implementieren, wo Sie sie brauchen.

    
LBushkin 22.12.2010 17:17
quelle
8

Hier ist ein einfacher Code, den ich beim Debuggen für so etwas verwende:

%Vor%

Um es zu verwenden, könnte Ihr Code etwa so aussehen:

%Vor%     
Michael Hoffmann 23.12.2010 23:01
quelle
4

Es hängt wirklich davon ab, wie tief Sie die Entitäten vergleichen wollen, aber die Idee mit Reflexion ist hier die beste. Der Code wäre etwa so:

%Vor%

Wenn Sie verschachtelte Objekte tief verarbeiten müssen, benötigen Sie, wie bereits erwähnt, eine Hash-Tabelle, die bereits verarbeitete Objekte speichert und verhindert, dass sie erneut verarbeitet werden. Hoffe das hilft!

    
Michael Sagalovich 22.12.2010 17:33
quelle
3

Ich habe die Antwort von Michael Hoffmann verwendet, aber ich fand es wenig hilfreich, wenn eine der Eigenschaften null ist und wenn man einen Fehler (normalerweise beim Vergleich von "Type" -Objekten) gibt oder wenn es sich um eine Sammlung handelt.

>

Während noch Arbeit zu erledigen ist, poste ich hier den modifizierten Basiscode:

%Vor%     
yoel halb 17.06.2013 02:36
quelle
2

Was ist mit so etwas?

Dadurch erhalten Sie eine Liste der Eigenschaftsnamen, die sich zwischen den beiden Objekten unterscheiden. Ich denke nicht, dass dies der Weg zu der Lösung ist, nach der Sie suchen, aber ich denke, es ist ein anständiger Start.

%Vor%

In meinem Beispiel würde dies "Prop2" zurückgeben, da dies die Eigenschaft ist, deren Werte sich zwischen den Objekten unterscheiden.

BEARBEITEN : Dies setzt natürlich voraus, dass komplexe Typen in Ihrem Objekt Gleichheitsvergleiche implementieren, die das tun, was Sie erwarten. Wenn nicht, müssten Sie das Objektdiagramm abtauchen und geschachtelte Vergleiche durchführen, wie es andere vorgeschlagen haben

    
Brad Cunningham 22.12.2010 17:41
quelle
1

Sie müssen rekursiv alle privaten und öffentlichen Eigenschaften und Felder des gesamten Objektdiagramms durchlaufen. Verwenden Sie ein HashSet, um Objekte zu verfolgen, die Sie bereits überprüft haben, sodass Sie keine doppelten Ergebnisse zurückgeben oder in einen Stapelüberlauf geraten.

Wenn der Eigenschaftstyp IComparable ist, können Sie die Werte dieser Eigenschaft in IComparable umwandeln und IComparable.CompareTo verwenden. Wenn nicht, müssen Sie die Differenzmethode für die Unterobjekte rekursiv aufrufen.

    
Amy 22.12.2010 17:26
quelle

Tags und Links