views:

2532

answers:

3

Hi,

I have a List<MyObj> with the class MyObj : IComparable. I wrote the method CompareTo in the MyObj class per the IComparable interface, but when I use the List<MyObj>.Contains(myObjInstance) it returns false when it should be true.

I'm not sure I'm understanding how I need to proceed to make sure the List uses my custom comparison method when calling then Contains function.

Here is my compareTo implementation:

    #region IComparable Members

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

    #endregion

Note the Symbol property is a string.

To clarify I've put a stopping point in that compareTo method and it doesn't even go in there.

Anyone has ever tried that?

Thanks.

+11  A: 

The absolute easiest way to find out whether your CompareTo method is called is to set a breakpoint in it and hit F5 to run your program. But I believe that List<T>.Contains looks for the IEquatable<T> interface for making the comparison.

Fredrik Mörk
done that. It doesn't stop in there. :(
Lancelot
@Lancelot: Read the second sentence as well ;o)
Fredrik Mörk
Sorry I read a little fast. I will try that out and let you know. Thanks. :)
Lancelot
That was it. The secret was the IEquatable interface. :)Thank you.
Lancelot
This worked for a problem I was having as well. Thanks much.
Penguinix
+1  A: 

Did you try overriding the Equals method?

List<T>, according to reflector, uses EqualityComparer<T> to check for containment, and the default implementation (ObjectEqualityComparer) uses Equals for most normal objects.

Senthil Kumar
+3  A: 

According to the documentation for List<T>.Contains, it uses either your implementation of IEquatable interface or object.Equals, that you can override as well.

svick