-1

对于我的年终项目,我需要开发一个图像处理和人工智能应用程序。

我的图像处理已经完成,所以我正在转向人工智能。但是我这里有一个问题。

我将尝试描述这里的情况。

对于正确的图像处理,我需要一个可以通过跳棋规则验证棋盘的 AI。所以我需要用最后一个已知状态检查比赛场地的当前状态。

因此,为此我创建了一个带有currentBoard二维数组的对象,以及一个使用currentBoard(= 最后已知状态)验证板的原始输入的方法。

然而,当另一个对象——我的图像处理对象——用他的方法完成时,它会改变currentBoard我的 AI 对象中的数组。

这与我在主窗体中创建的新数组相同。我认为这是堆/堆栈的原因。

我希望我的问题清晰易懂。我知道我不是最擅长描述情况的,所以当你不完全理解某个部分时请告诉我。

4

1 回答 1

1

数组是引用类型,因此,正如您所发现的,在一个位置更改数组内容将更改任何其他包含对同一对象的引用的代码。

为避免更改数组,您应该获取二维数组的深层副本并使用该副本。请注意,我们必须对数组及其内部数组进行深拷贝:

        int[][] original = {new[] {1,2,3}, new[] {4,5,6}};

        int[][] deepCopy = new int[original.Length][];

        for (int index = 0; index < original.Length; index++)
        {
            var row = original[index];
            int[] rowCopy = new int[row.Length];
            row.CopyTo(rowCopy, 0);

            deepCopy[index] = rowCopy;
        }

您还可以使用一些简单的 linq 产生相同的结果:

int[][] deepCopyLinq = original.Select(x => x.ToArray()).ToArray();
于 2012-05-01T01:03:57.960 回答