我想创建一个二维数组的二维数组.在编译时,维数n是不知道的.
我最终将数组定义为一个字典,键是一个对应于不同轴的整数的数组(所以在三维数组中,我会提供[5,2,3]来获得double(5,3).
但是,我还需要从(0,… 0)到(m1,m2,… mn)的双精度填充字典,其中m1到mn是每个轴的长度.
我最初的想法是创建嵌套for循环,但是由于我仍然不知道我需要多少(每个维度为1),我在编译时不能这样做.
我希望我以可以理解的方式提出这个问题,但请随时要求我详细说明部分内容.
解决方法
要创建一个n维数组,可以使用
Array.CreateInstance
方法:
Array array = Array.CreateInstance(typeof(double),5,3,8,7,32)); array.SetValue(0.5d,0); double val1 = (double)array.GetValue(0,0); array.SetValue(1.5d,1,6,30); double val2 = (double)array.GetValue(1,30);
要填充数组,您可以使用Rank属性和GetLength方法返回当前维度的长度,使用几个嵌套for循环来执行O(n ^ m)算法(警告 – 未测试):
private bool Increment(Array array,int[] idxs,int dim) { if (dim >= array.Rank) return false; if (++idxs[idxs.Length-dim-1] == array.GetLength(dim)) { idxs[idxs.Length-dim-1] = 0; return Increment(array,idxs,dim+1); } return true; } Array array = Array.CreateInstance(typeof(double),...); int[] idxs = new int[array.Rank]; while (Increment(array,0)) { array.SetValue(1d,idxs); }