未知维度数组的顺序填充

Vla*_*lad -1 c# arrays algorithm performance multidimensional-array

我有一个Array未知的维度。例如,它可能是object[]object[,]object[,,,]

我想按顺序填充它(例如 [2,2] 这个顺序:0,0; ​​0,1, 1,0; 1,1):

Array arr = ... // input array
for (int i = 0; i < arr.Length; i++)
{
     arr.SetValue(stream.ReadNextObject(), ???); // convert i -> int[] indexes
}
Run Code Online (Sandbox Code Playgroud)

我知道i可以使用%运算符进行对话,但很难想象多维的精确算法。二维只有一个答案:将一维数组的索引转换为二维数组即行和列

我可以用来Stack<int>在遍历数组时存储索引,但似乎这样%会更有效率(我真的需要在这里关心性能)。但我不确定Stack<T>vs %

juh*_*arr 5

这是我相信您正在寻找的算法

public static int[] SingleIndexToMulti(int index, int[] dimentionSizes)
{
    var result = new int[dimentionSizes.Length];
    for (int i = dimentionSizes.Length - 1; i >=0; i--)
    {
        result[i] = index % dimentionSizes[i];
        index = index / dimentionSizes[i];
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它

Array myArray = Whatever();
int[] dimensionSizes = new int[myArray.Rank];
for(int i =0; i < myArray.Rank; i++)
    dimensionsSizes[i] = myArray.GetLength(i);
for (int i = 0; i < arr.Length; i++)
{
    arr.SetValue(stream.ReadNextObject(), SingleIndexToMulti(i, dimensionSizes)); 
}
Run Code Online (Sandbox Code Playgroud)

演示以下代码

for(int i=0; i < (2*3*4) ;i++)
    Console.WriteLine(string.Join(",", SingleIndexToMulti(i, new[] { 2, 3, 4 })));
Run Code Online (Sandbox Code Playgroud)

生产

0,0,0

0,0,1

0,0,2

0,0,3

0,1,0

0,1,1

0,1,2

0,1,3

0,2,0

0,2,1

0,2,2

0,2,3

1,0,0

1,0,1

1,0,2

1,0,3

1,1,0

1,1,1

1,1,2

1,1,3

1,2,0

1,2,1

1,2,2

1,2,3