在C#中,如何正确地重载我的类中的Equals运算符,以便Queue.Contains()工作?

我创建了一个类State.对于State对象的队列,我想测试Queue是否已经包含一个值相等的State对象.当数组的所有值相等且顺序相同时,两个State对象(每个对象包含一个2D布尔数组)相等.

这是我的相关代码:

public class State {
   Boolean[,] grid = new Boolean[4,4];

   Public State(Boolean[,] passedGrid){ //Constructor
       grid = Array.Copy(passedGrid, grid, 16);
   }

   public bool Equals(State s2){ //Overloaded equals operator
         for (int x = 0; x < 4; x++){
                 for (int y = 0; y < 4; y++){
                      if (grid[x, y] != s2.grid[x, y]){
                            return false;
                        }
                    }
                }
                return true;
            }

}

    public void testContains(Boolean[] testArray) {
        Queue<State> testQueue = new Queue<State>();
        State s1 = new State(testArray);
        State s2 = new State(testArray);
        testQueue.Enqueue(s1);
        Boolean b = testQueue.Contains(s2);
    }

不幸的是,当调用testContains()并且我最后检查testQueue.Contains(s2)的值时,它仍然说测试是假的,即使它们具有相同的数组值并且Equals运算符被重载以测试它.我需要做什么或改变以使Queue.Contains与我的对象一起工作?我在某地读到,当Equals重载时,建议重载getHashCode().在这种情况下我需要这样做吗?如果是这样,重载的getHashCode()应该怎么做?

解决方法:

要覆盖Equals,您需要使用object作为参数类型和关键字override.

所以你可以尝试类似的东西

    public override bool Equals(object obj)
    {
        return Equals(obj as State);
    }
    public bool Equals(State s2)
    { //Overloaded equals operator 
        for (int x = 0; x < 4; x++)
        {
            for (int y = 0; y < 4; y++)
            {
                if (grid[x, y] != s2.grid[x, y])
                {
                    return false;
                }
            }
        }
        return true;
    }

您可能还应该包含null测试

看看Guidelines for Overloading Equals() and Operator == (C# Programming Guide)

上一篇:如何列出Linux中所有命名空间中的所有网络链接


下一篇:Git 笔记三 Git的初步使用