C#HashSet Equals方法

时间:2014-10-06 12:24:19

标签: c#

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 

1 个答案:

答案 0 :(得分:0)

很难按照你在这里提出的问题;许多拼写和语法错误。但是,根据我能够理解的内容,您在两个对象(称为A和B)的集合中说,并且当您仅添加B {{}时,您想知道为什么正在调用1}}。

调用

A.Equals来确定A.Equals(B)。如果A等于B,则B等于A,并且没有理由调用A equals B。这是平等的对称属性。