Wenn ich Objekte als Schlüssel für a verwenden möchte Dictionary
, welche Methoden muss ich überschreiben, damit sie auf bestimmte Weise verglichen werden?
Angenommen, ich habe eine Klasse mit Eigenschaften:
class Foo {
public string Name { get; set; }
public int FooID { get; set; }
// elided
}
Und ich möchte ein erstellen:
Dictionary<Foo, List<Stuff>>
Ich möchte, dass Foo
Objekte mit FooID
derselben Gruppe als dieselbe Gruppe betrachtet werden. Welche Methoden muss ich in der Foo
Klasse überschreiben ?
Zusammenfassend: Ich möchte Stuff
Objekte in Listen kategorisieren , die nach Foo
Objekten gruppiert sind. Stuff
Objekte müssen FooID
sie mit ihrer Kategorie verknüpfen.
quelle
Da
FooID
dies der Bezeichner für die Gruppe sein soll, sollten Sie diesen als Schlüssel im Wörterbuch anstelle des Foo-Objekts verwenden:Wenn Sie das
Foo
Objekt als Schlüssel verwenden würden, würden Sie nur die MethodeGetHashCode
und implementierenEquals
, um nur dieFooID
Eigenschaft zu berücksichtigen . DieName
Eigenschaft wäre nur totes Gewicht, was dasDictionary
betrifft, so würden Sie nurFoo
als Wrapper für eine verwendenint
.Daher ist es besser, den
FooID
Wert direkt zu verwenden, und dann müssen Sie nichts implementieren, da diesDictionary
bereits die Verwendung von aint
als Schlüssel unterstützt.Bearbeiten:
Wenn Sie die
Foo
Klasse trotzdem als Schlüssel verwenden möchten ,IEqualityComparer<Foo>
ist das einfach zu implementieren:Verwendung:
quelle
Für Foo müssen Sie object.GetHashCode () und object.Equals () überschreiben.
Das Wörterbuch ruft GetHashCode () auf, um einen Hash-Bucket für jeden Wert zu berechnen, und Equals, um zu vergleichen, ob zwei Foo identisch sind.
Stellen Sie sicher, dass Sie gute Hash-Codes berechnen (vermeiden Sie viele gleiche Foo-Objekte mit demselben Hash-Code), aber stellen Sie sicher, dass zwei gleiche Foos denselben Hash-Code haben. Vielleicht möchten Sie mit der Equals-Methode beginnen und dann (in GetHashCode ()) xor den Hash-Code jedes Mitglieds, das Sie in Equals vergleichen.
quelle
Was ist mit
Hashtable
Klasse!Auf die oben beschriebene Weise können Sie jedes Objekt (Ihr Klassenobjekt) als generischen Wörterbuchschlüssel verwenden :)
quelle
Ich hatte das gleiche Problem. Ich kann jetzt jedes Objekt, das ich versucht habe, als Schlüssel verwenden, da Equals und GetHashCode überschrieben werden.
Hier ist eine Klasse, die ich mit Methoden erstellt habe, die innerhalb der Überschreibungen von Equals (object obj) und GetHashCode () verwendet werden können. Ich entschied mich für Generika und einen Hashing-Algorithmus, der die meisten Objekte abdecken sollte. Bitte lassen Sie mich wissen, wenn Sie hier etwas sehen, das für einige Objekttypen nicht funktioniert, und Sie haben eine Möglichkeit, es zu verbessern.
So wird es in einer Klasse verwendet:
quelle