Frage

Ich habe ein Wörterbuch, das ich auf ein anderes Wörterbuch (Variablen als IDictionary getippt) bin im Vergleich. Doing d1.Equals (d2) ergibt falsch. Schreiben meiner eigenen Code unten ergibt wahr. Beide sind System.Collections.Generic.Dictionary. Bin ich etwas fehlt oder nicht Dictionary keine Equals Implementierung haben, die Schlüssel / Werte?

vergleicht
private static bool DictEquals<K, V>(IDictionary<K, V> d1, IDictionary<K, V> d2)
{
    if (d1.Count != d2.Count)
        return false;

    foreach (KeyValuePair<K, V> pair in d1)
    {
        if (!d2.ContainsKey(pair.Key))
            return false;

        if (!Equals(d2[pair.Key], pair.Value))
            return false;
    }

    return true;
}
War es hilfreich?

Lösung

Dictionary.Equals () verwendet der Standard Equals von Objekt, zu überprüfen, ob die beiden Objekte der gleiche Bezug sind, ebenso wie alle anderen Standardsammlungen. Sie sind frei, Ihre eigene Unterklasse mit Wertsemantik zu erstellen, obwohl das in der Regel beinhaltet unveränderlich, die Dinge auch.

Andere Tipps

die Equals Methode der Dictionary Klasse Wahrscheinlich greift einfach auf die Standardimplementierung von Object geerbt, das heißt, es vergleicht nur die Dictionary Objektreferenz mit einer eigenen Referenz übergeben. Siehe hier: Object.Equals Referenz

Unter der Annahme, dass zwei Wörterbücher, ein ein SortedList<TKey, TValue> und ein ein Dictionary<TKey, TValue> sein, auf Gleichheit verglichen wird, sollte es wirklich wahr zurück, wenn die Elemente gleich sind? Das wäre ziemlich schlecht sein, da sie unterschiedliche Eigenschaften und Merkmale aufweisen (die SortedList<,> zum Beispiel erlaubt Abruf über Index).

Auch die Gleichheit und die Hash-Code sind logisch miteinander verknüpft. Der Hash-Code sollte unveränderlich sein, da sonst alle Hash-basierte Algorithmen wird nicht funktionieren. Sie können dies nicht garantieren, wenn Sie den Inhalt auf Gleichheit zu überprüfen verwenden. Daher ist die Standardimplementierung (prüft wird, ob sie dieselbe Instanz sind) ist ziemlich gesund. Du bist frei, wenn Sie Ihren eigenen Inhalte Gleichheitsvergleich erstellen.

Andere haben erwähnt, dass es die Object.Equals Implementierung verwendet, können Sie die folgenden Funktionen außer Kraft setzen sie verwenden:

public class EqualsDictionary<T, T> : Dictionary<T, T>
{
    public override bool Equals(object obj)
    {
        //Place your comparison implementation here
    }
}

Referenzen in .NET verwendet werden kann, eine Objektidentität, wandelbaren Aspekte ihres Staates, beide oder keines von beiden zu verkapseln, zusätzlich zu den unveränderlichen Aspekte der den Zustand eines Objekts eingekapselt wird. In der Regel einen bestimmten Grund abwesend sonst zu übernehmen, geht davon aus, dass Verweise auf .NET veränderbare Objekte zur Identität der Verkapselung verwendet werden. Es geht ferner davon aus, dass in Fällen, in denen Codereferenzen vergleichen, ohne zu wissen, was sie darstellen, ist es besser, auf der Seite der Berichterstattung Dinge ungleich irrt. Als solche sind zwei Referenzen auf veränderliche Objekte äquivalent allgemein betrachtet, wenn und nur wenn sie das gleiche Objekt zu identifizieren und wandelbar Typen werden somit aus zwingenden Equals entmutigt, etwas anderes zu zeigen. Stattdessen Code, der Referenzen verwendet wandelbaren Zustand einzukapseln sollten einige verwenden andere Mittel als Object.Equals() sie zu vergleichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top