using System;
class Sample {
static void Print(Array arr)
{
Console.WriteLine("次元: {0}", arr.Rank);
Console.Write("長さ: ");
for (var d = 0; d < arr.Rank; d++) {
if (0 < d)
Console.Write("×{0}", arr.GetLength(d));
else
Console.Write("{0}", arr.GetLength(d));
}
Console.WriteLine();
Console.WriteLine("要素数: {0}", arr.Length);
Console.Write("要素: ");
// 取得したい要素のインデックスを指定するための配列
var indices = new int[arr.Rank];
for (;;) {
// [step1] step3でインデックスをインクリメントした結果、各次元の長さに達したかどうか調べる
for (var d = arr.Rank - 1; 0 <= d; d--) {
if (arr.GetLength(d) <= indices[d]) {
// d次元目のインデックスがd次元目の長さを越えている場合
if (d == 0) {
// 1次元目(d = 0)の場合は、インクリメントした結果が1次元目の長さに達しているので終了する
Console.WriteLine();
return;
}
else {
// d次元目のインデックスを0に戻し、一つ低い次元(d - 1次元)のインデックスをインクリメントする
indices[d] = 0;
indices[d - 1]++;
}
}
}
// [step2] 指定されたインデックスの要素を取得して表示
Console.Write("{0}, ", arr.GetValue(indices));
// [step3] もっとも高い次元のインデックスをインクリメント
indices[arr.Rank - 1]++;
}
}
static void Main()
{
// 5個の要素を持つ1次元配列
int[] arr = {
0, 1, 2, 3, 4,
};
Print(arr);
Console.WriteLine();
// 3×4個の要素を持つ2次元配列
int[,] matrix = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11},
};
Print(matrix);
Console.WriteLine();
// 4×2×3個の要素を持つ3次元配列
int[,,] cube = {
{ { 0, 1, 2}, { 3, 4, 5} },
{ { 6, 7, 8}, { 9, 10, 11} },
{ {12, 13, 14}, {15, 16, 17} },
{ {18, 19, 20}, {21, 22, 23} },
};
Print(cube);
Console.WriteLine();
// 2×2×2×2個の要素を持つ4次元配列
int[,,,] tesseract = {
{ { {0, 1}, { 2, 3} }, { { 4, 5}, { 6, 7} } },
{ { {8, 9}, {10, 11} }, { {12, 13}, {14, 15} } },
};
Print(tesseract);
Console.WriteLine();
// 1×1×1×1×1個の要素を持つ5次元配列
Print(new int[1, 1, 1, 1, 1]);
Console.WriteLine();
// 1×0×1×0×1×0個の要素を持つ6次元配列
Print(new int[1, 0, 1, 0, 1, 0]);
Console.WriteLine();
}
}