例如,我有一个3D数组
float[,,] a3d;
它用一些元素初始化。如何将其更改为1D数组但不进行任何复制(使用堆中的相同数据)。
float[] a1d;
a1d = ???
使用不安全模式指针很好。
答案 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。