在不相关的对象中更改数组

本文关键字:数组 对象 不相关 | 更新日期: 2023-09-27 18:32:49

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

我的图像处理已经完成,所以我要转向AI。但是我这里有一个问题。

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

为了进行正确的图像处理,我需要一个可以通过跳棋规则验证电路板的 AI。所以我需要用最后的已知状态检查运动场的当前状态。

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

但是,当另一个对象(我的图像处理对象(完成他的方法时,它将更改我的 AI 对象中的数组currentBoard

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

我希望我把我的问题说清楚和容易理解。我知道我不擅长描述情况,所以当你不完全理解某个部分时,请告诉我。

在不相关的对象中更改数组

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

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

        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();