実行時にオブジェクトが配列か、多次元配列か、多段ジャグ配列かどうかを調べるたい場合、型情報(Type)を参照することで検証することができます。
型情報からは、まずType.IsArrayプロパティによって、型が配列(多次元配列・多段ジャグ配列を含む)かどうかを判別することができます。 また、Array.Rankプロパティを参照することにより、Rankが1
なら配列またはジャグ配列、2
以上なら多次元配列として分類することができます。 さらに、Type.GetElementTypeメソッドを呼び出すことにより、配列の要素の型を取得することができるため、1次元の配列なのかジャグ配列なのか、またジャグ配列の場合は何段なのかを知ることができます。
これを具体的なコードにすると、次のようになります。
オブジェクトが配列か多次元配列かジャグ配列かを判別する
Imports System
Imports System.Collections.Generic
Class Sample
Shared Sub Main()
PrintTypeOfArray(New Integer() {})
PrintTypeOfArray(New Integer(,) {{}})
PrintTypeOfArray(New Integer(,,) {{{}}})
PrintTypeOfArray(New Integer()() { New Integer() {} })
PrintTypeOfArray(New Integer()()() { New Integer()() { New Integer() {} } })
PrintTypeOfArray(0)
PrintTypeOfArray(Nothing)
End Sub
' 引数で与えられるオブジェクトから、配列の種類を分類して表示する
Shared Sub PrintTypeOfArray(ByVal o As Object)
If o Is Nothing Then
Console.WriteLine("Nothingです")
Return
End If
' 型情報を取得する
Dim t As Type = o.GetType()
' 型が配列かどうか
If Not t.IsArray Then
Console.WriteLine($"配列ではありません ({t})")
Return
End If
' 配列(Array)にキャスト
Dim arr As Array = DirectCast(o, Array)
' 配列は多次元化かどうか
If 1 < arr.Rank Then
Console.WriteLine($"{arr.Rank}次元配列です ({t})")
Else
' 配列が1次元の場合、配列の要素の型が配列となっているか
' どうかを再帰的に調べ、同時にその段数も調べる
Dim nest As Integer = 1
Dim te As Type = t
Do
te = te.GetElementType()
' 配列の要素の型が配列かどうか
If te.IsArray Then
nest += 1 ' 段数を計上する
Else
Exit Do
End If
Loop
If nest = 1 Then
Console.WriteLine($"配列です ({t})")
Else
Console.WriteLine($"{nest}段のジャグ配列です ({t})")
End If
End If
End Sub
End Class
実行結果
配列です (System.Int32[]) 2次元配列です (System.Int32[,]) 3次元配列です (System.Int32[,,]) 2段ジャグ配列です (System.Int32[][]) 3段ジャグ配列です (System.Int32[][][]) 配列ではありません (System.Int32) Nothingです