如何在类中重载 Equals 运算符以便 Queue.Contains() 正常工作?

A_O*_*gon 6 c# containers overloading equals

我创建了一个类 State。对于 State 对象的队列,我想测试队列是否已包含相同值的 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

Adr*_*der 3

要覆盖 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;
    }
Run Code Online (Sandbox Code Playgroud)

您可能还应该包括测试null

查看如何定义类或结构的值相等(C# 编程指南)