C# 自指类上的不等式

C# 自指类上的不等式,c#,forms,self-reference,C#,Forms,Self Reference,使用表单从用户获取输入,将其创建到对象ToDo中。信息被抛出到这个自引用类ToDo中以创建对象,然后被传递到另一个类队列 但问题是,我需要将传递的以下对象与以前的其他对象进行比较。如果对象具有相同的名称,则不要将信息抛出队列类 但是从我的代码来看,Equals方法甚至没有执行。只是想知道我做错了什么 public class ToDo : IEquatable<ToDo> { private string _name; private string _priority

使用表单从用户获取输入,将其创建到对象ToDo中。信息被抛出到这个自引用类ToDo中以创建对象,然后被传递到另一个类队列

但问题是,我需要将传递的以下对象与以前的其他对象进行比较。如果对象具有相同的名称,则不要将信息抛出队列类

但是从我的代码来看,Equals方法甚至没有执行。只是想知道我做错了什么

public class ToDo : IEquatable<ToDo>
{
    private string _name;
    private string _priority;

    private ToDo _next;
    private ToDo _previous;

    Queue queue = new Queue();


    public ToDo(string name, string priority)
    {

        _name = name;
        _priority = priority;

        _next = null;
        _previous = null;

        queue.Enqueue(this);

    }

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public string Priority
    {
        get { return _priority; }
        set { _priority = value; }
    }

    public ToDo Next
    {
        get { return _next; }
        set { _next = value; }
    }

    public ToDo Previous
    {
        get { return _previous; }
        set { _previous = value; }
    }



    public bool Equals(ToDo other)
    {
        if (ReferenceEquals(null, other)) 
            return false;
        if (ReferenceEquals(this, other)) 
            return true;

        return other.Name.Equals(Name);
    }

    public override bool Equals(object obj)
    {
        if (Object.ReferenceEquals(null, obj))

            return false;

        if (Object.ReferenceEquals(this, obj))

            return true;

        if (this.GetType() != obj.GetType())

            return false;

        return this.Equals(obj as ToDo);

    }

    public override int GetHashCode()
    {
        return this.Name.GetHashCode();
    }



}

这是一个您可以使用的IEqualityComparer类。IEqualityComparer的优点是可以在LINQ语句中使用此比较器,如

var todos1 = todos2.Except(todos3, new ToDoComparer());

public class ToDoComparer : IEqualityComparer<ToDo>
{
    public bool Equals(ToDo x, ToDo y)
    {
        //Check whether the compared objects reference the same data. 
        if (ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null. 
        if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
            return false;

        return x.Name.Equals(y.Name);
    }

    public int GetHashCode(ToDo todo)
    {            
        if (ReferenceEquals(todo, null) || todo.Name == null)
            return 0;
        return todo.Name.GetHashCode();
    }
}

您可以尝试创建另一个实现IEqualityComparer的类并使用它。我在过去成功地使用了IEqualityComparer为什么要将对象放入对象内部的队列中?特别是因为队列似乎没有被使用,或者您只是为了简洁而省略了该代码?这将为您创建的每个对象生成一个队列。你确定这是你想要的行为吗?是的,对不起,伙计们。为了更简短的描述,我删去了queue类。有点忽略queue.Enqueue代码行,它将解决queue.Enqueue方法在equals返回true时执行的问题