Question

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.

Was it helpful?

Solution

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.

OTHER TIPS

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.

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top