在C#中索引到任意等级的数组

Ken*_*nky 5 c# arrays iteration padding pinning

我需要遍历任意排名的数组.这适用于阅读和写作,所以GetEnumerator不起作用.

Array.SetValue(object, int)不适用于多维数组. Array.SetValue(object, params int[])需要过多的算术来迭代多维空间.它还需要动态调用来绕过params签名的一部分.

我很想固定数组并用指针迭代它,但我找不到任何文档说多维数组保证是连续的.如果他们在维度的末尾有填充,那么这将无效.我也更愿意避免不安全的代码.

是否有一种简单的方法来仅使用单个索引顺序寻址多维数组?

dtb*_*dtb 5

多维数组保证是连续的.来自ECMA-335:

数组元素应按行主要顺序排列在数组对象中(即,与最右边的数组维度相关的元素应从最低到最高的索引连续排列).

这样可行:

int[,,,] array = new int[10, 10, 10, 10];

fixed (int* ptr = array)
{
    ptr[10] = 42;
}

int result = array[0, 0, 1, 0];  // == 42
Run Code Online (Sandbox Code Playgroud)