実行時にオブジェクトが配列か、多次元配列か、多段ジャグ配列かどうかを調べるたい場合、型情報(Type)を参照することで検証することができます。
型情報からは、まずType.IsArrayプロパティによって、型が配列(多次元配列・多段ジャグ配列を含む)かどうかを判別することができます。 また、Array.Rankプロパティを参照することにより、Rankが1
なら配列またはジャグ配列、2
以上なら多次元配列として分類することができます。 さらに、Type.GetElementTypeメソッドを呼び出すことにより、配列の要素の型を取得することができるため、1次元の配列なのかジャグ配列なのか、またジャグ配列の場合は何段なのかを知ることができます。
これを具体的なコードにすると、次のようになります。
オブジェクトが配列か多次元配列かジャグ配列かを判別する
using System;
class Sample {
static void Main()
{
PrintTypeOfArray(new int[0]);
PrintTypeOfArray(new int[0, 0]);
PrintTypeOfArray(new int[0, 0, 0]);
PrintTypeOfArray(new int[1][] { new int[0] });
PrintTypeOfArray(new int[1][][] { new int[1][] { new int[0] } });
PrintTypeOfArray(0);
PrintTypeOfArray(null);
}
// 引数で与えられるオブジェクトから、配列の種類を分類して表示する
static void PrintTypeOfArray(object o)
{
if (o is null) {
Console.WriteLine("nullです");
return;
}
// 型情報を取得する
var t = o.GetType();
// 型が配列かどうか
if (!t.IsArray) {
Console.WriteLine($"配列ではありません ({t})");
return;
}
// 配列(Array)にキャスト
var arr = (Array)o;
// 配列は多次元化かどうか
if (1 < arr.Rank) {
Console.WriteLine($"{arr.Rank}次元配列です ({t})");
}
else {
// 配列が1次元の場合、配列の要素の型が配列となっているか
// どうかを再帰的に調べ、同時にその段数も調べる
var nest = 1;
var te = t;
for (;;) {
te = te.GetElementType();
// 配列の要素の型が配列かどうか
if (te.IsArray)
nest++; // 段数を計上する
else
break;
}
if (nest == 1)
Console.WriteLine($"配列です ({t})");
else
Console.WriteLine($"{nest}段のジャグ配列です ({t})");
}
}
}
実行結果
配列です (System.Int32[]) 2次元配列です (System.Int32[,]) 3次元配列です (System.Int32[,,]) 2段ジャグ配列です (System.Int32[][]) 3段ジャグ配列です (System.Int32[][][]) 配列ではありません (System.Int32) Nothingです