Auf welche Methode greift List.contains() zu?

19/10/2007 - 10:14 von Susanne Klemm | Report spam
Hallo,

ich versuche gerade herauszufinden, wie ich
List<MyClass>.contains(myClassObject) auf meine Klasse abstimmen kann.
Ich habe es mit überschreiben von equals und GetHashCode probiert, aber
darauf wird nicht zugegriffen. Anbei ein kleines Beispiel zur
Verdeutlichung meines Problems:

class MyClass
{
public object ID;

//wird beim debuggen nicht erreicht
public overridebool Equals(MyClass pObject)
{
return this.ID.equals(pObject.ID);
}

//wird beim debuggen nicht erreicht
public override int GetHashCode()
{
return ID.GetHashCode();
}
}

...
MyClass cls1 = new MyClass();
cls1.ID="test";
MyClass cls2 = new MyClass();
cls2.ID="test";
List<MyClass> list = new List<MyClass>();
list.Add(cls1);

//hier möchte ich true erhalten, weil die ID gleich ist. Es wird aber
immer false zurückgegeben
bool b = list.contains(cls2);
...

Meine Frage ist also: wie muss ich MyClass erweitern, damit beim Suchen
in einer List<MyClass> Objekte mit der gleichen ID als gefunden erkannt
werden?

Danke im Voraus
Susanne
 

Lesen sie die antworten

#1 Andre Stille
19/10/2007 - 10:48 | Warnen spam
Hallo Susanne,

"Susanne Klemm" schrieb im Newsbeitrag
news:ff9ovd$5bj$

Meine Frage ist also: wie muss ich MyClass erweitern, damit beim Suchen in
einer List<MyClass> Objekte mit der gleichen ID als gefunden erkannt
werden?




Eigentlich sollte der C#-Compiler mit einer Fehlermeldung darauf hinweisen,
dass dein Code versucht, eine nicht vorhandene Funktion zu überladen.

Es gibt zwei Möglichkeiten, den Code zu korrigieren:

1) Du ànderst bei der Equals-Funktion das Argument von MyClass in Object
um, dann wird System.Object.Equals korrekt überladen. Natürlich muss dann
das Argument nach MyClass gecastet werden.

2) Du entfernst das override von der Equals-Funktion und leitest die Klasse
von IEquatable<MyClass> ab. Da hier kein Cast notwendig ist, ist anzunehmen,
dass diese Variante performanter ist.

Um Verwirrungen zu vermeiden, würde ich beide Möglichkeiten implementieren.
Die Collection-Klassen benutzen den zweiten Fall, direkte Vergleiche
zwischen zwei MyClass-Objekten benutzen den ersten Fall.

MfG
Andre Stille

Ähnliche fragen