问题
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.
回答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.
回答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.
回答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.
来源:https://stackoverflow.com/questions/1076350/modify-list-contains-behavior