C# C HashSet-Equals方法
HashSet Contains check的Equals对象obj方法未按预期方式运行,我无法找到根本原因。任何帮助都将不胜感激 我使用一个C哈希集来存储类对象POS。我已经声明它为 公共静态哈希集存储=新哈希集 调用Store.Add时,将正确地存储在Hashset中 当我尝试将Store.ContainsB用于GetHasCode为A和B返回相同的hascode时,将调用Equals方法。我所面临的问题是,在Equal方法中,我从未得到obj A的调用。它总是给我obj B作为引用,因此计算结果为true。由于A和B的hascode相同,不应使用obj A作为参考来调用Equals /*要在Hashset中输入的类对象如下所示*/C# C HashSet-Equals方法,c#,C#,HashSet Contains check的Equals对象obj方法未按预期方式运行,我无法找到根本原因。任何帮助都将不胜感激 我使用一个C哈希集来存储类对象POS。我已经声明它为 公共静态哈希集存储=新哈希集 调用Store.Add时,将正确地存储在Hashset中 当我尝试将Store.ContainsB用于GetHasCode为A和B返回相同的hascode时,将调用Equals方法。我所面临的问题是,在Equal方法中,我从未得到obj A的调用。它总是给我obj B作为引用,因此计
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
很难理解你在这里提出的问题;许多拼写和语法错误。但是,从我所能理解的情况来看,在两个对象的集合中,我们称它们为a和B,你想知道为什么当你加上B时,只有a.Equals被调用
调用A.EqualsB是为了计算A是否等于B。如果A等于B,那么B等于A,并且没有理由调用B.EqualsA。这是等式的对称性质。这无关紧要。Equals应该是对称的、自反的和传递的,因此您必须实现它,以便a.Equalsb==b.equalsA您使用的是.NET的哪个版本?如果它超过了.NET1.1,那么最好实现IEquatable。由于泛型的存在,这是类型安全的,所以您不必担心重写GetHashCode。@krillgar您始终必须依次重写Equals和GetHashCode-因此,如果他重写Equals,他也必须重写GetHashCode,尤其是在使用HashSet时。我写了一个解释。听起来你好像说它叫b.Equalsb,你不知道为什么。我们需要查看您正在谈论的所有这些添加的代码。一段文字没有那么有用。