ジャグ配列の場合と同様、多次元配列もArray.Sortメソッドではソートすることは出来ません。 そもそもArray.Sortメソッドは1次元配列のみのソートしかサポートしていないため、Comparison<T>を指定しても多次元配列ソートすることは出来ず、RankExceptionがスローされます。 そこで、多次元配列をソートするには、一旦すべての要素を1次元配列に展開してからソートするか、次元毎に展開してジャグ配列に変換してからソートするなどの方法をとる必要があります。
次の例では、2次元配列を2段のジャグ配列に変換してからソートを行っています。 ジャグ配列のソートについては§.ジャグ配列のソートで解説したとおりですが、多次元配列から作成したジャグ配列は各次元の配列の長さが同じとなるため、長さが異なる場合を考慮する必要がなくなります。
2段のジャグ配列に変換して2次元配列をソートする
Imports System
Class Sample
' 2次元配列を2段のジャグ配列に変換
Shared Function ToJaggedArray(ByVal arr As Integer(,)) As Integer()()
' 2段のジャグ配列を作成
Dim jagged As Integer()() = New Integer(arr.GetLength(0) - 1)() {}
For y As Integer = 0 To arr.GetLength(0) - 1
' 配列を作成してジャグ配列内に格納
jagged(y) = New Integer(arr.GetLength(1) - 1) {}
For x As Integer = 0 To arr.GetLength(1) - 1
' 2次元配列の内容を作成したジャグ配列にコピー
jagged(y)(x) = arr(y, x)
Next
Next
Return jagged
End Function
' 長さが同じ二つの配列を比較するメソッド
Shared Function CompareArray(ByVal x As Integer(), ByVal y As Integer()) As Integer
For n As Integer = 0 To x.Length - 1
If x(n) > y(n) Then
Return 1
Else If x(n) < y(n) Then
Return -1
End If
Next
Return 0
End Function
Shared Sub Main()
Dim arr As Integer(,) = New Integer(,) { _
{1, 2, 1}, _
{2, 1, 1}, _
{2, 2, 1}, _
{2, 1, 1}, _
{2, 1, 2}, _
{1, 2, 3}, _
{1, 1, 1}, _
{1, 2, 2} _
}
' ジャグ配列に変換
Dim jagged As Integer()() = ToJaggedArray(arr)
' 変換したジャグ配列をソート
Array.Sort(jagged, AddressOf CompareArray)
For y As Integer = 0 To jagged.Length - 1
For x As Integer = 0 To jagged(y).Length - 1
Console.Write("{0}, ", jagged(y)(x))
Next
Console.WriteLine()
Next
End Sub
End Class
実行結果
1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 2, 3, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1,