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
沒關係。 'Equals'應該是對稱的,自反的和傳遞的,因此你必須實現它,以便'a.Equals(b)== b.Equals(a)' – 2014-10-06 12:29:02
你使用的是什麼版本的.NET?如果它是關於.NET 1.1的東西,那麼最好實施'IEquatable'。由於泛型是安全的,因此您不必擔心重寫'GetHashCode()'。 –
krillgar
2014-10-06 12:29:06
@krillgar你總是必須重寫'Equals'和'GetHashCode',所以如果他重寫'Equals',他必須重寫'GetHashCode',特別是當使用'HashSet'時。我寫了一個解釋[這裏](http://stackoverflow.com/a/26202958/3764814)。 – 2014-10-06 12:31:01