2014-10-06 58 views
0

HashSet Contains檢查的Equals(object obj)方法沒有按預期的方式運行,我無法引起它的根本原因。任何幫助將不勝感激。C#HashSet Equals方法

我正在使用C#HashSet來存儲類對象POS。已宣佈它爲
public static HashSet Store = new HashSet();

調用Store.Add(A)A正確存儲在Hashset中。

當我嘗試Store.Contains(B)的情況下,當GetHasCode返回相同的A和B的hascode時,調用Equals方法。我面臨的問題是在Equal方法中,我從來沒有得到obj A的調用。它的方式給了我obj B作爲參考,因此評估爲true。由於A和B的hascode是相同的,所以不應該用obj A作爲參考來調用Equals?

/*的Hashset中要輸入的類對象下面給出*/

public class POS 
{ 
    private int[] R = new int[Constants.MaxN]; 
    public int prev; 

    /** Methods for the class goes here **/ 


    /* To use enter the object in Hashset placed the GetHashCode and Equals functions below */ 
    public override int GetHashCode() 
    { 
     uint val=0; 
     uint temp = 0; 
     int j = 0; 
     for (long i = 0; i < Globals.GetN(); i++) 
     { 
      if (i > 9) { break; } 
      temp = (uint)R[i]; 
      j = (int)i * 3; 
      val |= (temp << j); 
     } 
     return (int) val; 
     } 
    public override bool Equals(object obj) 
    { 
     int temp, tmp; 
     var POSitem = obj as POS; 
     Console.WriteLine("Entered:"); 
     if (obj == null) { return false; } 
     if (ReferenceEquals(this, POSitem)) return true; 

     for (int i = 0; i < Globals.GetN(); i++) 
     { 
      temp = this.Give(i); 
      tmp = POSitem.Give(i); 
      if (temp != tmp) return false; 
     } 
     return true; 

    } 
} // end braces of POS 
+3

沒關係。 'Equals'應該是對稱的,自反的和傳遞的,因此你必須實現它,以便'a.Equals(b)== b.Equals(a)' – 2014-10-06 12:29:02

+0

你使用的是什麼版本的.NET?如果它是關於.NET 1.1的東西,那麼最好實施'IEquatable '。由於泛型是安全的,因此您不必擔心重寫'GetHashCode()'。 – krillgar 2014-10-06 12:29:06

+6

@krillgar你總是必須重寫'Equals'和'GetHashCode',所以如果他重寫'Equals',他必須重寫'GetHashCode',特別是當使用'HashSet'時。我寫了一個解釋[這裏](http://stackoverflow.com/a/26202958/3764814)。 – 2014-10-06 12:31:01

回答

0

這真的很難跟隨你問這裏是什麼;許多拼寫和語法錯誤。但是,從我已經能夠理解的情況來看,你說的是在兩個對象的集合中(稱它們爲A和B),並且你想知道爲什麼當你僅添加B時,正在調用A.Equals

A.Equals(B)被調用來確定是否A equals B。如果A等於B,那麼B等於A,並且沒有理由調用B.Equals(A)。這是平等的對稱性質。