2014-11-14 2 views
0

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

Проблема в том, что мне нужно сравнить следующий объект, который передается, другим предыдущим объектам. Если объект имеет то же имя, не бросайте информацию в класс 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(); 
    } 



} 
+0

Вы могли бы попытаться сделать еще один класс, который реализует IEqualityComparer и использовать его вместо. Я использовал IEqualityComparer с успехом в прошлом – reggaeguitar

+0

Почему вы помещаете объект в очередь, находящуюся внутри объекта? Тем более, что очередь не используется (или вы просто опустили этот код для краткости?) – juharr

+1

Это создаст очередь для каждого создаваемого вами объекта. Вы уверены, что это ваше желаемое поведение? –

ответ

0

Это класс 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(); 
    } 
} 
Смежные вопросы