2016-05-10 2 views
1

Wenn Sie über eine Klasse verfügen, die GetHashCode und Equals implementiert, können Sie ein Wörterbuch mit dieser Klasse als Schlüssel für den Vergleich auf der Grundlage der Referenz des Objekts erzwingen, anstatt einen Hash zu generieren oder einen Vergleich mit Equals durchzuführen?Wie verwenden Sie eine Objektreferenz als Schlüssel in einem C# -Dictionary, wenn die Klasse Equals und GetHashCode implementiert?

Zum Beispiel, wenn ich eine Sammlung von globalen, unveränderlichen System.Drawing.Bitmap in meinen Ressourcen habe, kann ich sie als Schlüssel in einem Wörterbuch billig verwenden, indem sie vergleichen, was in C++ wäre ihre Adresse? Das sind ziemlich große Bilder, und ich würde es hassen, wenn sie den Hash sogar einmal erzeugen würden, um eine Schlüsselsuche durchzuführen.

Ich hoffe nur auf eine optimale Möglichkeit, diese Objekte als Schlüssel zu verwenden, da ihre Referenzen und Inhalte sich nie ändern werden.

Antwort

3

Sie eine Dictionary mit einem benutzerdefinierten bauen IEqualityComparer, die in RuntimeHelpers.GetHashCode aufruft und object.ReferenceEquals für die Gleichstellung Vergleich:

class IdentityEqualityComparer<T> : IEqualityComparer<T> where T : class { 
    public bool Equals(T v1, T v2) { 
     return object.ReferenceEquals(v1, v2); 
    } 
    public int GetHashCode(T v) { 
     return RuntimeHelpers.GetHashCode(v); 
    } 
} 

Jetzt können Sie ein Wörterbuch wie diese machen:

var identityDict = new Dictionary<MyKey,MyVal>(
    new IdentityEqualityComparer<MyKey>(); 
); 
+0

so toll gearbeitet . Leider scheinen die Properties.Resources-Eigenschaften nicht global zu sein und ändern sich jedes Mal, wenn Sie sie erhalten. So viel zu dieser Annahme. – cppguy

0

Was Sie untersuchen möchten, ist eine Datenbank. Visual Studio bietet die Möglichkeit, SQL-Datenbanken zu erstellen. Von dort können Sie einen Wert einem anderen zuordnen. Zum Beispiel: Sie können eine Reihe von zufällig generierten Zahlen zum Dateipfad des Bildes zuordnen lassen. Ich bin nicht vertraut mit System.Drawing, also weiß ich nicht, ob Sie eine Datenbank mit programmatisch erzeugten Bildern erstellen könnten.

Verwandte Themen