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

3
例如,我有一个3D数组。
float[,,] a3d;

它被初始化了一些元素。我该如何将其转换为1D数组,但是不进行任何复制(使用堆中相同的数据)。

float[] a1d;
a1d = ???

使用不安全模式指针是可以的。


你的意思是不进行任何复制吗? - Evan Trimboli
@EvanTrimboli 意味着通过1D数组在堆中不分配任何数据。 - user1899020
C#是一种托管框架语言,如果你开始担心堆栈中发生了什么事情,那么你真的在过度思考你的问题。除此之外,由于3D数组和1D数组的表示方式并不相同,所以你想要的结果并不是很明显... - Claies
我想你的意思是你只想转换变量的类型。但这是不可能的。C# 和 C++ 不同。也许你可以创建一个访问方法,通过传递单个索引值来返回相应的成员? - David Thielen
1
选项2:反转问题。将所有东西存储在一维数组中,并添加一个包装器以便能够使用3个索引访问元素的能力。 - theB
2个回答

2

如果您愿意使用不安全的方式,可以将多维数组作为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 托管数组。这种固定指针块的有限范围是托管运行时的一个非常故意的限制。


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

按这种方式设置是不可能的,据我所知。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接