HashSet包含检查的Equals(object obj)方法没有以预期的方式运行,我无法根本原因。任何帮助将不胜感激。
我正在使用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
答案 0 :(得分:0)
很难按照你在这里提出的问题;许多拼写和语法错误。但是,根据我能够理解的内容,您在两个对象(称为A和B)的集合中说,并且当您仅添加B {{}时,您想知道为什么正在调用1}}。
调用 A.Equals
来确定A.Equals(B)
。如果A等于B,则B等于A,并且没有理由调用A equals B
。这是平等的对称属性。