检查两个数组是否相等:返回不正确的结果

时间:2013-10-28 10:52:36

标签: c# arrays

我正在尝试检查两个大小相等的数组是否在相同的索引处包含相同的整数。如果某个元素不相等,我想返回true,否则返回false

public bool multipleSolutions(int[,] grid)
{
    int[,] front = new int[9, 9];
    front = grid;
    int[,] back = new int[9, 9];
    back = grid;
    front = solve(front);
    back = solveBackwards(back);
    for (int r = 0; r < 9; r++)
    {
        for (int c = 0; c < 9; c++)
        {
            if (back[r, c] != front[r, c])
            {
                return true;
            }
        }
    }
    return false;
}

单独测试时,solvesolveBackwards会给出两个不同的数组,但是当我尝试multipleSolutions时,它仍然会给我false(因为它们是两个不同的数组,我希望它返回true)。

2 个答案:

答案 0 :(得分:1)

由于测试逻辑是正确的,导致此错误的最可能原因是solvesolvebackwards的实现更改了传入的数组并返回相同的数组。

对于solve和solveBackwards的调用,传入参数grid标识的数组。因此,如果solve更改了传入的数组,那么solveBackwards的输入已根据第一次运行进行了更改。这可能会影响solveBackwards。结果不会有所不同,因为在完成solveBackwards时,在上述假设下。正面和背面都将是solveBackwards的结果

<强>假设

  • solve and solveBackwards改变传入的数组
  • solve和solveBacrwards的返回值是传入的数组

修改 看到这些假设是正确的,您可以将其作为solve和solveBackwards中的第一行插入

var temp = new int[9,9]
Array.Copy(grid, 0, temp, 0, grid.Length);

然后通过执行solve和solvebackwards来使用temp。

或者你可以在将它们作为参数传递之前对前后做同样的事情

然而,您应该更改两种方法的返回类型。指定返回类型表示返回不同的对象而不是改变参数。这也是为什么我更喜欢第一个选项(在方法中复制数组)

然而,在我看来,更好的是迭代输入数组并使用结果构造一个不可用的

答案 1 :(得分:-1)

问题是您将grid数组放在frontback变量中。将数组赋值给数组变量时,它不会将数据从一个数组复制到另一个数组,而是将引用复制到数组对象。所有引用都将指向同一个数组对象。

要将数据从一个数组复制到另一个数组,您可以使用Copy方法:

int[,] front = new int[9, 9];
Array.Copy(grid, front, grid.Length);
int[,] back = new int[9, 9];
Array.Copy(grid, back, grid.Length);

现在您有两个新的数组对象,其中包含原始网格中的数据。