Modify List.Contains behavior

12,347

Solution 1

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.

Solution 2

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.

Solution 3

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.

Share:
12,347
Lancelot
Author by

Lancelot

Software Engineer with experience in Node.js, C#, Java

Updated on July 27, 2022

Comments

  • Lancelot
    Lancelot over 1 year

    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.