use*_*737 3 c# multidimensional-array
我有一个具有不同维度的通用多维数组。我需要循环遍历它,以便为每个元素保存索引的相对数组和相对值。
对于二维数组(假设为 4 和 5),这将是微不足道的:
var d1 = 4;
var d2 = 5;
var array = Array.CreateInstance(typeof (int), new[] {d1, d2});
//...
// code for populating array
//...
for (int i = 0; i < d1; i++)
{
for (int j = 0; j < d2; j++)
{
var value = array.GetValue(new[] { i, j });
var indices = new[] {i, j};
}
}
Run Code Online (Sandbox Code Playgroud)
但我需要对 n 个不同维度的数组做同样的事情。我怎样才能实现它?我需要实现递归函数吗?
访问多维数组中的所有元素并不困难。您可以简单地使用单个索引对整个数组进行平面迭代。棘手的部分是将这个单一索引映射到相应的多维坐标。
一般来说,给定一个大小为向量 的矩阵D,i该矩阵的第一个索引元素具有一个坐标向量C_i,使得:

为了0 <= n < size(D)。
实现这个的IndexToCoordinates方法是:
static int[] IndexToCoordinates(int i, Array arr)
{
var dims = Enumerable.Range(0, arr.Rank)
.Select(arr.GetLength)
.ToArray();
Func<int, int, int> product = (i1, i2) => i1 * i2;
return dims.Select((d, n) => (i/dims.Take(n).Aggregate(1, product))%d).ToArray();
}
Run Code Online (Sandbox Code Playgroud)
现在,例如,如果您想访问多维数组中的每个项目并输出其坐标,您可以这样做:
static void OutputAllArrayIndices(Array arr)
{
var i = 0;
foreach (int item in arr)
{
var coords = IndexToCoordinates(i++, arr);
Console.WriteLine(string.Join(", ", coords));
}
}
Run Code Online (Sandbox Code Playgroud)
运行OutputAllArrayIndices(new int[3, 2, 4])然后产生:
0, 0, 0
1, 0, 0
2, 0, 0
3, 0, 0
0, 1, 0
1, 1, 0
2, 1, 0
3, 1, 0
0, 0, 1
1, 0, 1
2, 0, 1
3, 0, 1
0, 1, 1
1, 1, 1
2, 1, 1
3, 1, 1
0, 0, 2
1, 0, 2
2, 0, 2
3, 0, 2
0, 1, 2
1, 1, 2
2, 1, 2
3, 1, 2
Run Code Online (Sandbox Code Playgroud)