IEquatable для самореферентного класса

Использование формы для получения ввода от пользователя для преобразования его в объект (ToDo). Информация передается в этот самореферентный класс (ToDo) для создания объекта, а затем передается другому классу Queue.

Однако проблема в том, что мне нужно сравнить следующий переданный объект с другими предыдущими объектами. Если объект имеет такое же имя, не передавайте информацию в класс Queue.

Но из моего кода метод 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();
    }



}

person 1011 1110    schedule 14.11.2014    source источник
comment
Вы можете попробовать создать другой класс, реализующий IEqualityComparer‹ToDo›, и использовать его вместо этого. Я успешно использовал IEqualityComparer в прошлом   -  person reggaeguitar    schedule 14.11.2014
comment
Почему вы помещаете объект в очередь, которая находится внутри объекта? Тем более, что очередь, похоже, не используется (или вы просто пропустили этот код для краткости?)   -  person juharr    schedule 14.11.2014
comment
Это создаст очередь для каждого объекта, который вы создаете. Вы уверены, что это желаемое поведение?   -  person Yuval Itzchakov    schedule 14.11.2014
comment
Да, извините, ребята. Я вырезал класс очереди для более краткого описания. Своего рода просто игнорируйте строку кода queue.Enqueue, собирался обойти выполнение метода queue.Enqueue, если equals возвращает true   -  person 1011 1110    schedule 14.11.2014


Ответы (1)


Вот класс 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();
    }
}
person reggaeguitar    schedule 14.11.2014