Array.Sortメソッドも、ソート時の比較処理をIComparerで指定することが出来ます。 次のコードは、CurrentCultureとOrdinalでアラビア数字・漢数字・囲み文字を並べ替えたときの違いを出力する例です。
StringComparerを指定して丸囲み・括弧付きのアラビア数字・漢数字をソートする
using System;
class Sample {
static void Main()
{
var numbers = new string[] {
// 半角アラビア数字
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
// 丸囲みアラビア数字
"①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩",
// 括弧付きアラビア数字
"⑴", "⑵", "⑶", "⑷", "⑸", "⑹", "⑺", "⑻", "⑼", "⑽",
// 終止符付きアラビア数字
"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑",
// 漢数字
"一", "二", "三", "四", "五", "六", "七", "八", "九", "十",
// 丸囲み漢数字
"㊀", "㊁", "㊂", "㊃", "㊄", "㊅", "㊆", "㊇", "㊈", "㊉",
// 括弧付き漢数字
"㈠", "㈡", "㈢", "㈣", "㈤", "㈥", "㈦", "㈧", "㈨", "㈩",
};
Console.WriteLine("StringComparer.CurrentCulture");
Array.Sort(numbers, StringComparer.CurrentCulture);
for (var i = 0; i < numbers.Length; i++) {
Console.Write("{0} ", numbers[i]);
if (i % 20 == 19)
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("StringComparer.Ordinal");
Array.Sort(numbers, StringComparer.Ordinal);
for (var i = 0; i < numbers.Length; i++) {
Console.Write("{0} ", numbers[i]);
if (i % 20 == 19)
Console.WriteLine();
}
Console.WriteLine();
}
}
実行結果
StringComparer.CurrentCulture 1 ① ⑴ ⒈ 10 2 ② ⑵ ⒉ 3 ③ ⑶ ⒊ 4 ④ ⑷ ⒋ 5 ⑤ ⑸ ⒌ 6 ⑥ ⑹ ⒍ 7 ⑦ ⑺ ⒎ 8 ⑧ ⑻ ⒏ 9 ⑨ ⑼ ⒐ ⑩ ⑽ ⒑ 一 ㈠ ㊀ 九 ㈨ ㊈ 五 ㈤ ㊄ 三 ㈢ ㊂ 四 ㈣ ㊃ 七 ㈦ ㊆ 十 ㈩ ㊉ 二 ㈡ ㊁ 八 ㈧ ㊇ 六 ㈥ ㊅ StringComparer.Ordinal 1 10 2 3 4 5 6 7 8 9 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ ㊀ ㊁ ㊂ ㊃ ㊄ ㊅ ㊆ ㊇ ㊈ ㊉ 一 七 三 九 二 五 八 六 十 四
CurrentCulture
では、アラビア数字は数字の大きさ、漢数字は漢字の読みに従って並べ替えられ、Ordinal
ではコードポイントに従って並べ替えられていることが分かると思います。