Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C HashSet-Equals方法_C# - Fatal编程技术网

C# C HashSet-Equals方法

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作为引用,因此计

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中输入的类对象如下所示*/

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,你不知道为什么。我们需要查看您正在谈论的所有这些添加的代码。一段文字没有那么有用。