C#: Vergleichen von zwei Objekten?
Hallo,
ich habe zwei Listen mit Objekten.
Was ist der beste Weg, um die Objekte der Listen zu vergleichen?
Beispiel-Klasse:
class Person
{
int Id;
string Name;
String Adresse;
IEnumerable<string> Telefon
}
In jeder Liste sind 150 Einträge vorhanden.
Wie kann ich nun herausfinden, ob sich Werte der Liste verändert haben, indem ich die Objekte vergleiche?
4 Antworten
Wenn Du die Klasse ändern kannst, dann implementiere IEquatable<T>.
Wenn Du sie nicht ändern kannst, dann implementiere IEqualityComparer<T> in einer eigenen Klasse.
Und ich gehe davon aus, dass Liste 1 das "Vorher" und Liste 2 das "Nachher" ist?
Wenn die Indizes gleich sind, dann bau eine for-Schleife, die über beide Listen läuft und jedes Item mit dem gleichen Index vergleicht, die passende Equals-Methode kommt von IEquatable<T>, oder von IEqualityComparer<T>.
Oder Du nutzt die Except-Methode und übergibst den IEqualityComparer<T>, mit list1.Except(list2) bekommst Du alle Items, die nicht in List2 verhanden sind, bzw. umgekehrt.
Beachte aber, dass dein ganzes Konzept stirbt, wenn die Objekt-Instanzen die Selben sind, denn dann sind alle Änderungen in Liste 2 natürlich auch in Liste 1 vorhanden.
Du könntest in der Klasse noch eine CheckSumme einführen,
die aus den Personenattributen gebildet wird. Dann müsstest du nur diese vergelichen anstatt jedes einzelne Attribut. Die ID des Eintrages würde die Hauptorientierung bilden, was in der 2ten Liste anzuschauen ist.
Na dann. Ich gehe davon aus, dass auch die ID unique vorhanden bleiben muss.
Dann gilt es zunächst in der 2ten Liste die gleiche ID zu finden und im Anschluss die vorhandenen Attribute zu vergleichen.
Also eine art Mapping von den alten und neuen Objekten !?
Die Liste(n) stelle ich mir als Array aller Personen vor. Nun nimmst du das erste Element(Index 0) -die ID- der erste List und suchst diese ID in der 2ten Liste. Ggf als Index 8 gefunden. Nun vergleichst du die weiteren Attribute auf Gleichheit. Was bei einem Unterschied passieren muss, weiß ich nicht. Welche Liste Henne und welche Ei ist hat der Programmierer in der Hand. Ggf wird auch ein Merge beider Liste gewünscht, so dass neue Personen in Liste 2 nach Liste 1 übernommen werden.
* Irgentein ding z.b. int, string, objekt, liste
* == *
Beispiel zum anwenden:
a = input('Gebe einen string ein')
if reversed(a) == a :
print(Der eingegebener string ist ein Palindrom.')
else :
print(Der eingegebener string ist kein Palindrom.')
ich habe das mal so gelöst, indem ich den inhalt beider object mit einem binaryformatter in byte arrays gespeichert habe. diese beiden byte arrays kann man dann einfach mit bytearray1.SequenceEqual(bytearray2) vergleichen. dazu muss allerdings die entsprechende klasse als [serializable] gekennzeichnet werden.
Die Klasse selber kann ich nicht Verändern.