Vergleich zweier Wörterbücher in C #

8

Ich habe zwei Wörterbücher, beide mit der gleichen Struktur und Reihenfolge (eine soll eine exakte Replikation der anderen sein): Dictionary<int, ICustomInterface> und ich möchte überprüfen, ob sie mit SequenceEqual<>

gleich sind

Zuerst wandle ich das erste Wörterbuch in XML und lese es dann zurück, um das zweite zu erstellen. Bei der ersten Inspektion sind sie beide gleich. Die ICustomeInterface -Objekte überschreiben die Equals-Methode jeweils korrekt. Um dies zu überprüfen, überspringe ich die Elemente der beiden Wörterbücher und vergleiche sie. Sie sind alle gleich.

Aber wenn ich SequenceEqual : dictionary1.SequenceEqual(dictionary2); aufrufe, wird false zurückgegeben und die Equals-Methode der ICustomInterface -Objekte wird nie aufgerufen und gibt immer false zurück. Wenn ich das tue:

%Vor%

alles funktioniert wie erwartet und es gibt für jede Zeile true zurück. Also, was passiert, wenn ich einfach SequnceEqual im Wörterbuch selbst anrufe?

    
sbenderli 19.07.2011, 19:48
quelle

2 Antworten

15

"Was passiert" ist der Vergleich von KeyValuePair -Einträgen für die beiden Wörterbücher der Reihe nach. Wörterbücher sind von Natur aus ungeordnet - Sie sollten sich nicht auf die Reihenfolge verlassen, in der Einträge aus ihnen herauskommen. Wenn Sie Folgendes verwenden:

%Vor%

Ich vermute, Sie werden diese Übereinstimmungen finden. Es ist jedoch eine ziemlich unangenehme Art, sie zu vergleichen:)

    
Jon Skeet 19.07.2011, 19:51
quelle
1

Jon Skeet hat bereits eine gute Erklärung gegeben.

Wenn Sie (oder jemand anders, der diese Frage liest) nur eine effiziente Methode zum Vergleichen von Wörterbüchern verwenden möchten, ist eine einfache Linq-basierte Erweiterung genau das:

%Vor%

Es sieht vielleicht ein wenig fluffig aus, aber ich wollte eine gute Lesbarkeit (und Null-Tests).

Wenn Sie also nur einen Einzeiler haben und Sie bereits wissen, dass beide Wörterbücher nicht null sind und der TValue -Typ die Equals-Methode richtig überschreibt, dann nur Sie brauche so viel (sans the null-checks, ob TValue natürlich ein Werttyp ist):

%Vor%

Wenn Sie einen Vergleich durchführen möchten, bei dem die Wörterbücher nicht denselben Werttyp haben müssen, oder wenn Sie lieber einen Delegat- oder Lambda-Ausdruck verwenden möchten, anstatt einen IEqualityComparer implementieren zu müssen, ist diese Erweiterung geeignet für dich stattdessen:

%Vor%

Wie Sie sehen können, ist es fast dasselbe wie zuvor.

Hier ist ein Anwendungsbeispiel:

%Vor%

Wenn Sie den obigen Code ausführen, wird isEqual true.

    
AnorZaken 22.02.2016 01:52
quelle