如何在 C# 中填充 3D 数组的两个维度

How to fill two dimensions of a 3D array in C#

我正在使用 C# 处理多维数组,我想知道是否可以使用另一个 2 维数组填充 3 维数组的两个维度。我有两个数组:

byte[,,] thArray = new byte[1000, 1000, 1000];
byte[,] twArray = new byte[1000, 1000];

现在我需要做这样的事情:

thArray[,,0] = twArray;

是的,你可以在一个很好的旧 for loop:

 for (int x = 0; x < thArray.GetLength(0); ++x)
   for (int y = 0; y < thArray.GetLength(1); ++y)
     thArray[x, y, 0] = twArray[x, y];

如果你想在一次性赋值你可以使用byte[][,] thArray - 二维数组:

 byte[][,] thArray = new byte[1000][,];

 thArray[0] = twArray;

可以使用2个for循环将2维数组的值复制到3维数组,但保留3维数组的z值0:

int height = twArray.GetLength(0);
int width = twArray.GetLength(1);

for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
    {
        thArray[i, j, 0] = twArray[i, j];
    }
}

填充任何类型的数组都需要复制。因此,简单的答案是编写一个双循环,将每个值从 twArray 复制到 thArray。其他答案已经显示了如何执行此操作。

不过,我可能会分享一些使用大型多维数组的经验。

对于二维数组,我更喜欢使用一维数组的包装器而不是内置的多维数组。这使得一些操作更快,并允许使用 Buffer.BlockCopy 复制大的部分,并且在与其他系统互操作时通常更容易使用。索引值可以像 y*width + x.

这样完成

使用自定义类型还消除了在循环检查中调用 .GetLength() 的风险,因为此方法比检查常规 属性 慢数倍。一个容易犯的错误,但会使循环变慢。

对于 3D 数组,您可以使用相同的方法,只需添加另一个维度。但根据我的经验,这往往比使用锯齿状数组慢。因此,我建议对 3D 数组使用类似 byte[][] myArray 的东西,并使用 myArray[z][y * width + x] 对其进行索引,最好使用一些可以执行所有这些索引的自定义 class。