例如,我有一个3D数组。
float[,,] a3d;
它被初始化了一些元素。我该如何将其转换为1D数组,但是不进行任何复制(使用堆中相同的数据)。
float[] a1d;
a1d = ???
使用不安全模式指针是可以的。
float[,,] a3d;
它被初始化了一些元素。我该如何将其转换为1D数组,但是不进行任何复制(使用堆中相同的数据)。
float[] a1d;
a1d = ???
使用不安全模式指针是可以的。
如果您愿意使用不安全的方式,可以将多维数组作为float*按线性顺序访问。
例如,以下代码:
var b = new float[2, 3, 4];
fixed (float* pb = &b[0,0,0])
{
float* p = pb;
for (int i = 0; i < 2*3*4; i++)
{
*p = i + 1;
p++;
}
}
这将初始化数组为连续的值。这些值以“深度优先”的顺序存储,因此 b[0, 0, 0]、b[0, 0, 1]、b[0, 0, 2]、b[0, 0, 3]、b[0, 1, 0]、b[0, 1, 1] 等。
然而,这并不允许您保留指针或以某种方式“将其转换回”为 1d 托管数组。这种固定指针块的有限范围是托管运行时的一个非常故意的限制。
您可以通过枚举来获取任意维度数组的值:
float[,,] a3d = new float[2, 2, 2] {
{ { 1f, 2f }, { 3f, 4f } },
{ { 5f, 6f }, { 7f, 8f } }
};
foreach (float f in a3d)
Console.Write(f + " ");
输出:
1 2 3 4 5 6 7 8
按这种方式设置是不可能的,据我所知。