2011-01-04 6 views
4

Ich habe eine Klasse mit dem Namen Class1 ich seine Equals überschreiben Funktion Jetzt habe ich eine Instanz Wörterbuch Und ich hinzugefügt, um es eine Instanz von Class1 benannt OBJ1. Ich habe eine andere Instanz von Class1 namens OBJ2. Der Code gibt TRUE für OBJ1.Equals (OBJ2) zurück. Aber ich kann OBJ2 nicht im Wörterbuch finden.Dictionary-Klasse in C# - Gleichheit von zwei Objekt

Hier ist Pseudo-Code

Class1 OBJ1 = new Class1(x, y, z); 
Class1 OBJ2 = new Class1(a, b, c); 
Dictionary<Class1, int> dic1 = new Dictionary<Class1, int>(); 
dic1.Add(OBJ1, 3); 
OBJ1.Equals(OBJ2) -------------> return true 
Dictionary.ContainsKey(OBJ2) --------------> return false 

, warum dies geschieht? jede Hilfe wäre sehr willkommen

+4

Haben Sie GetHashcode auch für Ihre Klasse außer Kraft gesetzt? – BrokenGlass

Antwort

3

Stellen Sie sicher, Class1 überschreibt GetHashCode(). Die Rückgabe dieser Methode wird beim Vergleich der Gleichheit zuerst überprüft. Die Standardimplementierung ist für jedes Objekt eindeutig.

+0

Vielen Dank für Hilfe. Es ist repariert. – Masoud

12

Wahrscheinlich haben Sie nicht GetHashCode in einer Weise im Einklang mit Equals überschrieben.

Der Vertrag von GetHashCode verlangt, dass OBJ1.Equals(OBJ2) wenn true zurück, dann OBJ1.GetHashCode() den gleichen Wert wie OBJ2.GetHashCode() zurückgeben muss.

IIRC, Sie erhalten einen Compilerfehler (oder zumindest eine Warnung), wenn Sie Equals außer Kraft setzen, ohne GetHashCode() zu überschreiben.

Eine andere Möglichkeit ist, dass Sie nicht wirklich overriddenEquals, aber Überlastung durch eine neue Signatur hinzufügen, zum Beispiel

public bool Equals(Class1 other) 

Im Allgemeinen eine "natürliche" Wertgleichheit Vergleich zu bieten sollten Sie:

  • Aufschalten Equals (Objekt)
  • Aufschalten GetHashCode
  • betrachten Stark IEquatable<T>
  • Betrachten Umsetzung Überlastung == und! =
13

2 Möglichkeiten:

  1. GetHashCode wurde nicht ordnungsgemäß außer Kraft gesetzt. Vielleicht möchten Sie einen Blick auf Why is it important to override GetHashCode when Equals method is overriden in C#?
  2. werfen
  3. OBJ1 wurde mutiert, nachdem es dem Wörterbuch in einer Weise hinzugefügt wurde, die seinen Hashcode beeinflusst. In diesem Fall ist der Eimer, in den er gelegt wird, nicht mehr korrekt - ContainsKey wird dann in einem anderen Eimer nach ihm suchen.

Von Dictionary<TKey, TValue>:

Solange ein Objekt als Schlüssel im Wörterbuch verwendet wird, es darf nicht in irgendeiner Weise ändern, dass seinen Hash-Wert beeinträchtigt.

3

Haben Sie auch GetHashCode überschrieben? Können Sie die Implementierung der Equals-Methode anzeigen?

4

Wahrscheinlich haben Sie GetHashcode in Ihrer Klasse nicht überschrieben. Wenn Sie Equals überschreiben, müssen Sie auch GetHashcode überschreiben, ansonsten funktioniert das Dictionary nicht.

3

Haben Sie entweder die GetHashCode überschrieben?

3

Sie müssen GetHashCode auch außer Kraft zu setzen, aber auch nicht vergessen, dass man auch in einem benutzerdefinierten Comparer Wörterbuch-Konstruktor übergeben müssen möglicherweise as pointed out in this SO question

Verwandte Themen