### 如何使用线性索引在多维数组中设置值

``````int[,,] arr2 = {   {{0,1,2}, {3,4,5}, {6,7,8}}
, {{9,10,11}, {12,13,14}, {15,16,17}}
, {{18,19,20}, {21,22,23}, {24,25,26}}
};
``````

``````//This code does not work
for (int i = 0; i < arr.Length; i++)
{
arr.SetValue(30, i);
}
``````

``````static class Program
{
static void Main(string[] args)
{
//Sample input.
int[,,] arr2 = {   {{0,1,2}, {3,4,5}, {6,7,8}}
, {{9,10,11}, {12,13,14}, {15,16,17}}
, {{18,19,20}, {21,22,23}, {24,25,26}}
};

int[] arr1 = { 1, 2, 3, 4 };

setElementsTo30(arr2);
setElementsTo30(arr1);

}

//Must be able to process int arrays of arbitrary dimensions and content
private static void setElementsTo30(Array arr)
{
IList<int> cumulativeLength = getCumulativeLengths(arr);

for (int i = 0; i < arr.Length; i++)
{
SetValue(arr, i, 30, cumulativeLength);
}
}

public static void SetValue(this Array arr, int index, object value, IList<int> cumulativeLength)
{
int[] arrayIndex = new int[arr.Rank];

for (int dim = arr.Rank-1; dim >= 0; dim--)
{
arrayIndex[dim] = index / cumulativeLength[dim] % arr.GetLength(dim);
}

arr.SetValue(value, arrayIndex);
}

private static IList<int> getCumulativeLengths(Array arr)
{
List<int> lengths = new List<int>(arr.Rank);

for (int dim = 0; dim < arr.Rank; dim++)
{
int prod = 1;
for (int i = dim + 1; i < arr.Rank; i++)
{
prod *= arr.GetLength(i);
}
lengths.Add(prod);
}

return (IList<int>)lengths;
}
}
``````

SDX2000。

#### 4 个答案:

``````static void SetValue2(this Array a, object value, int i) {
int[] indices = new int[a.Rank];
for (int d = a.Rank - 1; d >= 0; d--) {
var l = a.GetLength(d);
indices[d] = i % l;
i /= l
}
a.SetValue(value, indices);
}
``````

``````static void Main(string[] args) {
int[, ,] arr2 = {
{{0,1,2}, {3,4,5}, {6,7,8}},
{{9,10,11}, {12,13,14}, {15,16,17}},
{{18,19,20}, {21,22,23}, {24,25,26}}
};
for (int i = 0; i < arr2.Length; i++) {
arr2.SetValue2(30, i);
}
}
``````

``````for i=0 to (a*b*c*d)

Array[i % a, (i/a) % b, (i/(a*b) % c, i / (a*b*c)] = 30
``````

``````PKG_CPPFLAGS =  -I../inst/include/
``````

`SetValue()`应该有效。看看this获得更多灵感。

``````{{30,30,30}, {30,30,30}, {30,30,30}}
, {{30,30,30}, {30,30,30}, {30,30,30}}
, {{30,30,30}, {30,30,30}, {30,30,30}

}
``````