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

C# 检查两个数组是否相等:返回不正确的结果,c#,arrays,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 = solve

我试图检查两个大小相等的数组是否在相同的索引中包含相同的整数。如果某些元素不相等,我希望返回
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;
}
公共布尔多重解算(int[,]网格) { int[,]front=新int[9,9]; 前=网格; int[,]back=新的int[9,9]; 背面=网格; 前=求解(前); 后退=后退(后退); for(int r=0;r<9;r++) { 对于(int c=0;c<9;c++) { 如果(后[r,c]!=前[r,c]) { 返回true; } } } 返回false; }
当分别测试时,
solve
solvebackward
给出两个不同的数组,但当我尝试
multipleSolutions
时,它仍然给出
false
(因为它们是两个不同的数组,我希望它返回
true
).

由于测试逻辑正确,导致此错误的最可能原因是执行
solve
solvebackward
更改传入的数组并返回相同的数组

对于solve和solvebackward调用,传入由参数grid标识的数组。因此,如果solve更改传入的数组,那么solvebackward的输入将根据第一次运行而更改。这可能会影响解决方案。但结果不会有什么不同,因为在上述假设下,当进行反向求解时。然后,前面和后面都将是向后解算的结果

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

  • solve和solveBackwards更改传入的数组
  • solve和solveBacrwards的返回值是传入的数组
编辑 看到假设是正确的,您可以将其作为solve和solveBackwards中的第一行插入

var temp = new int[9,9]
Array.Copy(grid, 0, temp, 0, grid.Length);
然后通过solve和solvebackwards的实现使用temp

或者,在将它们作为参数传入之前,可以对前面和后面执行相同的操作

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


然而,在我看来,更好的方法是迭代输入数组,并用结果构建一个不可解释的

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

要将数据从一个数组复制到另一个数组,可以使用
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);

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

为什么不使用
int[,]front=solve(grid);int[,]back=solveBackwards(网格)开始?这会更简单。特别是,您创建的那些新数组毫无意义。这些方法是否修改传入的数组?如果不知道这些方法的作用,很难帮助你。一个简短但完整的程序来演示这个问题将是理想的。在
solveBackwards
调用后添加一个断点并手动检查数组。只要所有数组都
[9,9]
for{for{}
中的
循环看起来正常。因此,您的错误出现在未发布的部分代码中。“这些方法是否修改传入的数组?”在函数内部修改它们,这是否也会更改函数外部的数组?@Tafari:它会在第一个不匹配的项处留下循环,因此这是完全正确的。如果所有项目都匹配,它只会返回
false
。是的,这正是我的问题。我怎样才能得到一个新的网格副本,这样我就可以向solve和solvebackwards发送原始网格的唯一副本?@HenkHolterman为什么?这是试图解决问题最可能的原因,尽管最可能的原因是缺乏对运行时的理解,但这并不是一个离题的问题。这个问题被描述得足够详细,可以给出一个解决问题的可能性很高的答案。你不能在二维数组上使用
ToArray
。我没有否决投票,但我认为可能是因为你遗漏了一个相当重要的细节。只要
solve
复制数组并返回副本,网格是否同时执行solve和solvebackward都没有关系,但鉴于我的答案也得到了DW,并且确实包含了该假设,可能还有其他原因:)@RuneFS:可能是原因,但否决票是不公平的,正如OP在对问题的评论中特别指出的,方法中的数组发生了变化。