修改List.Contains行为

时间:2009-07-02 19:51:59

标签: c# list contains icomparable icomparer

我有一个List<MyObj> class MyObj : IComparable。我根据CompareTo接口在MyObj类中编写了方法IComparable,但是当我使用List<MyObj>.Contains(myObjInstance)时,它返回false时应该是true }}。

我不确定我是否理解如何在调用List函数时确保Contains使用我的自定义比较方法。

这是我的compareTo实现:

    #region IComparable Members

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

    #endregion

注意Symbol属性是一个字符串。

为了澄清我在compareTo方法中设置了一个停止点,它甚至没有进入那里。

有人曾尝试过吗?

感谢。

3 个答案:

答案 0 :(得分:22)

确定是否调用CompareTo方法的最简单方法是在其中设置断点并按F5运行程序。但我相信List<T>.Contains会查找用于进行比较的IEquatable<T>界面。

答案 1 :(得分:5)

根据List<T>.Contains的{​​{3}},它使用您的IEquatable界面实现或object.Equals,您也可以覆盖。

答案 2 :(得分:2)

您是否尝试重写Equals方法?

根据反射器,

List<T>使用EqualityComparer<T>来检查包含,默认实现(ObjectEqualityComparer)对大多数普通对象使用Equals。