2009-07-02 11 views
8

Ich habe eine List<MyObj> mit der class MyObj : IComparable. Ich schrieb die Methode CompareTo in der MyObj Klasse über die Schnittstelle IComparable, aber wenn ich die List<MyObj>.Contains(myObjInstance) verwende, gibt es false zurück, wenn es true sein sollte.Modify List.Contains Verhalten

Ich bin mir nicht sicher, ich verstehe, wie ich fortfahren muss, um sicherzustellen, dass die List verwendet meine benutzerdefinierte Vergleichsmethode beim Aufruf dann Contains Funktion.

Hier ist meine compareTo Umsetzung:

#region IComparable Members 

    public int CompareTo(object obj) 
    { 
     MyObj myObj = (MyObj)obj; 
     return String.Compare(this.Symbol, myObj.Symbol, true); 
    } 

    #endregion 

Beachten Sie die Symbol-Eigenschaft ist eine Zeichenfolge.

Um zu verdeutlichen, habe ich einen Stop-Point in dieser compareTo-Methode gesetzt und es geht nicht einmal dort hinein.

Wer hat das jemals probiert?

Danke.

+0

Können Sie uns Ihren Code zeigen? –

+0

Speziell die Implementierung von CompareTo –

Antwort

22

Der einfachste Weg, um herauszufinden, ob Ihre CompareTo-Methode aufgerufen wird, besteht darin, einen Haltepunkt darin zu setzen und F5 zu drücken, um Ihr Programm auszuführen. Aber ich glaube, dass List<T>.Contains nach der IEquatable<T> Schnittstelle für den Vergleich sucht.

+0

getan, dass. Es hört nicht dort auf. :( – Lancelot

+0

@Lancelot: Lesen Sie auch den zweiten Satz; o) –

+0

Sorry ich lese ein wenig schnell. Ich werde es ausprobieren und Sie wissen lassen. Vielen Dank. :) – Lancelot

2

Haben Sie versucht, die Equals-Methode zu überschreiben?

List<T>, nach Reflektor verwendet EqualityComparer<T>, um nach Eindämmung zu suchen, und die Standardimplementierung (ObjectEqualityComparer) verwendet Equals für die meisten normalen Objekte.

5

Nach dem documentation für List<T>.Contains, verwendet er entweder Ihre Implementierung von IEquatable Schnittstelle oder object.Equals, dass Sie auch außer Kraft setzen können.