如何在C#中将3D数组类型转换为1D数组类型?

时间:2016-06-05 23:47:02

标签: c# arrays

例如,我有一个3D数组

float[,,] a3d;

它用一些元素初始化。如何将其更改为1D数组但不进行任何复制(使用堆中的相同数据)。

float[] a1d;
a1d = ???

使用不安全模式指针很好。

2 个答案:

答案 0 :(得分:2)

如果您愿意使用不安全的,您可以按线性顺序访问多维数组作为浮点*。

例如,此代码:

        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++;
            }
        }

这会将数组初始化为顺序值。这些值存储在&#39;深度优先&#39;排序,所以b [0,0,0],b [0,0,1],b [0,0,2],b [0,0,3],b [0,1,0],b [ 0,1,1]等等。

然而,这并不允许你将指针放在一边或以某种方式将其转回去#39;到1d托管数组。固定指针块的这种有限范围是对托管运行时的非常谨慎的限制。

答案 1 :(得分:0)

您可以通过枚举从任意维度的数组中获取值:

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

以这种方式设置是不可能的,afaik。