ジャグ配列の場合と同様、多次元配列もArray.Sortメソッドではソートすることは出来ません。 そもそもArray.Sortメソッドは1次元配列のみのソートしかサポートしていないため、Comparison<T>を指定しても多次元配列ソートすることは出来ず、RankExceptionがスローされます。 そこで、多次元配列をソートするには、一旦すべての要素を1次元配列に展開してからソートするか、次元毎に展開してジャグ配列に変換してからソートするなどの方法をとる必要があります。
次の例では、2次元配列を2段のジャグ配列に変換してからソートを行っています。 ジャグ配列のソートについては§.ジャグ配列のソートで解説したとおりですが、多次元配列から作成したジャグ配列は各次元の配列の長さが同じとなるため、長さが異なる場合を考慮する必要がなくなります。
2段のジャグ配列に変換して2次元配列をソートする
using System;
class Sample {
// 2次元配列を2段のジャグ配列に変換
static int[][] ToJaggedArray(int[,] arr)
{
// 2段のジャグ配列を作成
var jagged = new int[arr.GetLength(0)][];
for (var y = 0; y < arr.GetLength(0); y++) {
// 配列を作成してジャグ配列内に格納
jagged[y] = new int[arr.GetLength(1)];
for (var x = 0; x < arr.GetLength(1); x++) {
// 2次元配列の内容を作成したジャグ配列にコピー
jagged[y][x] = arr[y, x];
}
}
return jagged;
}
// 長さが同じ二つの配列を比較するメソッド
static int CompareArray(int[] x, int[] y)
{
for (var n = 0; n < x.Length; n++) {
if (x[n] > y[n])
return 1;
else if (x[n] < y[n])
return -1;
}
return 0;
}
static void Main()
{
var arr = new int[,] {
{1, 2, 1},
{2, 1, 1},
{2, 2, 1},
{2, 1, 1},
{2, 1, 2},
{1, 2, 3},
{1, 1, 1},
{1, 2, 2},
};
// ジャグ配列に変換
var jagged = ToJaggedArray(arr);
// 変換したジャグ配列をソート
Array.Sort(jagged, CompareArray);
for (var y = 0; y < jagged.Length; y++) {
for (var x = 0; x < jagged[y].Length; x++) {
Console.Write("{0}, ", jagged[y][x]);
}
Console.WriteLine();
}
}
}
実行結果
1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 2, 3, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1,