LinkedList.Contains。用于比较对象的方法是什么?

时间:2009-11-18 11:22:25

标签: .net linked-list contains

LinkedList.Contains方法。 (.NET 2)

如何在里面比较物体? (等于?CompareTo?)

MSDN对此一无所知。

情况:

interface IClass
{
    string GetName();
}

class Class1 : IClass, IEquatable<Class1>
{
    public string FirstName;
    public string LastName;

    string IClass.GetName() { return FirstName; }

    bool IEquatable<Class1>.Equals(Class1 other)
    {
        return FirstName.Equals(other.FirstName);
    }
}

class Class2 : IClass, IEquatable<Class2>
{
    public string FirstName;
    public string LastName;

    string IClass.GetName() { return LastName; }

    bool IEquatable<Class2>.Equals(Class2 other)
    {
        return LastName.Equals(other.LastName);
    }
}

public void TestMethod() 
{
    Class1 c1 = new Class1();
    c1.FirstName = "fn";
    c1.FirstName = "ln";

    Class2 c2 = new Class2();
    c2.FirstName = "fn";
    c2.FirstName = "ln";

    Class1 c3 = new Class1();
    c3.FirstName = "fn";
    c3.FirstName = "ln";

    LinkedList<IClass> myList = new LinkedList<IClass>();
    myList.AddFirst(c1);
    myList.AddFirst(c2);
    // false here
    MessageBox.Show("myList<IClass> contains c3? - " + (myList.Contains(c3)));

    LinkedList<Class1> myList1 = new LinkedList<Class1>();
    myList1.AddFirst(c1);
    myList1.AddFirst(c1);
    // true here
    MessageBox.Show("myList1<Class1> contains c3? - " + (myList1.Contains(c3)));
}

2 个答案:

答案 0 :(得分:6)

由于链接列表不是字典,我期望使用EqualityComparer<T>.Default.Equals(x,y)

这支持(按顺序):

  • IEquatable<T>(针对有问题的T
  • object.Equals(默认使用引用相等,或支持重写Equals(object)

请注意,EqualityComparer<T>还会为这两个类和null处理通常的Nullable<T>规则等。

(更新:已检查并更正;来自Find(T)

...
EqualityComparer<T> comparer = EqualityComparer<T>.Default;
...
if (comparer.Equals(head.item, value)) {...}
...

根据评论{<1}}更新以证明此工作正常:

ISomeInterface: IEquatable<ISomeInterface>

答案 1 :(得分:1)

实施的方法是Equals。我需要实现基本的Equals方法,而不一定是(?!)通用方法。

class Class1 : IClass, IEquatable<Class1>
{
    public string FirstName;
    public string LastName;

    string IClass.GetName() { return FirstName; }

    bool IEquatable<Class1>.Equals(Class1 other)
    {
        return FirstName.Equals(other.FirstName);
    }

    public override bool Equals(object obj)
    {
        if (obj is Class1)
        {
            return this.FirstName.Equals((obj as Class1).FirstName);
        }
        else
        {
            return base.Equals(obj);
        }
    }
}