如何在 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。
我正在使用 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。