2014-11-14 47 views
0

使用表單從用戶抓取輸入以將其創建爲對象(ToDo)。信息被引入到這個自引用類(ToDo)中以創建該對象,然後傳遞給另一個類Queue。IEquatable on Self Referential class

但問題是我需要將傳遞的以下對象與其他先前的對象進行比較。如果該對象具有相同的名稱,則不要將該信息扔到隊列類中。

但是從我的代碼中,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 2014-11-14 17:39:40

+0

爲什麼要將對象放入對象內部的隊列中?特別是因爲隊列似乎沒有被使用(或者你爲了簡潔而省略了該代碼?) – juharr 2014-11-14 17:55:36

+1

這將爲你創建的每個對象生成一個隊列。你確定這是你想要的行爲嗎? – 2014-11-14 17:57:40

回答

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(); 
    } 
}