Array.Sort() / Array.Reverse()
| 対応: | C# 1.0(2002) |
|---|
配列を昇順に並べ替える『Array.Sort()』と、配列の要素の順序を逆にする『Array.Reverse()』メソッドです。
構文
// 配列全体を昇順に並べ替えます(元の配列が変更されます)。 Array.Sort(T[] array) // 配列の index から length 個の要素を並べ替えます。 Array.Sort(T[] array, int index, int length) // 配列全体の要素の順序を逆にします(元の配列が変更されます)。 Array.Reverse(T[] array) // 配列の index から length 個の要素の順序を逆にします。 Array.Reverse(T[] array, int index, int length)
メソッド一覧
| メソッド | 概要 |
|---|---|
| Array.Sort(T[] array) | 配列をデフォルトの比較方法(数値なら数値順、文字列なら辞書順)で昇順に並べ替えます。 |
| Array.Sort(T[] array, int index, int length) | 配列の指定した範囲のみを昇順に並べ替えます。 |
| Array.Reverse(T[] array) | 配列全体の要素の並びを逆順にします。 |
| Array.Reverse(T[] array, int index, int length) | 配列の指定した範囲のみを逆順にします。 |
サンプルコード
Array.Sort() で数値配列を昇順に並べ替え、Array.Reverse() で逆順(降順)にします。
Program.cs
using System;
int[] powers = { 78, 92, 45, 88, 61 };
Array.Sort(powers);
Console.WriteLine(string.Join(", ", powers)); // 45, 61, 78, 88, 92
Array.Reverse(powers);
Console.WriteLine(string.Join(", ", powers)); // 92, 88, 78, 61, 45
string[] members = { "Majima Goro", "Kiryu Kazuma", "Akiyama Shun", "Saejima Taiga" };
Array.Sort(members);
Console.WriteLine(string.Join(", ", members));
コンパイルして実行すると次のようになります。
dotnet run 45, 61, 78, 88, 92 92, 88, 78, 61, 45 Akiyama Shun, Kiryu Kazuma, Majima Goro, Saejima Taiga
範囲を指定した並べ替え
Array.Sort() / Array.Reverse() の第2・第3引数で、並べ替える範囲(開始インデックスと要素数)を指定できます。指定した範囲外の要素は変更されません。
RangeSortSample.cs
using System;
int[] data = { 10, 50, 30, 20, 40 };
Array.Sort(data, 1, 3); // インデックス1から3要素(50, 30, 20)だけ並べ替える
Console.WriteLine(string.Join(", ", data)); // 10, 20, 30, 50, 40
int[] arr = { 1, 2, 3, 4, 5 };
Array.Reverse(arr, 1, 3); // インデックス1から3要素(2, 3, 4)だけ逆順にする
Console.WriteLine(string.Join(", ", arr)); // 1, 4, 3, 2, 5
コンパイルして実行すると次のようになります。
dotnet run 10, 20, 30, 50, 40 1, 4, 3, 2, 5
カスタム比較条件での並べ替え
Array.Sort() に Comparison<T> 型のデリゲート(ラムダ式)を渡すと、カスタムの条件で並べ替えられます。戻り値が負のとき x が先、正のとき y が先になります。
CustomSortSample.cs
using System;
string[] names = { "桐生一馬", "真島吾朗", "秋山駿", "冴島大河", "春日一番" };
// 文字列の長さで昇順に並べ替える
Array.Sort(names, (x, y) => x.Length - y.Length);
Console.WriteLine(string.Join(", ", names));
// 文字列の長さで降順に並べ替える
Array.Sort(names, (x, y) => y.Length - x.Length);
Console.WriteLine(string.Join(", ", names));
コンパイルして実行すると次のようになります。
dotnet run 秋山駿, 桐生一馬, 真島吾朗, 冴島大河, 春日一番 桐生一馬, 真島吾朗, 冴島大河, 春日一番, 秋山駿
よくあるミス
よくあるミス: 元の配列が変更されることへの気づき忘れ
Array.Sort() / Array.Reverse() はどちらも元の配列を直接変更します。並べ替え前の状態を保持したい場合は、あらかじめ Clone() でコピーを作ってから操作してください。
using System;
// NG: 元の配列も変更されてしまう
int[] original = { 3, 1, 4, 1, 5 };
Array.Sort(original);
Console.WriteLine(string.Join(", ", original)); // 1, 1, 3, 4, 5(元に戻せない)
修正後は次の通りです。
dotnet run 1, 1, 3, 4, 5
修正後は次の通りです。
using System;
// OK: Clone() でコピーしてから並べ替える
int[] original = { 3, 1, 4, 1, 5 };
int[] sorted = (int[])original.Clone();
Array.Sort(sorted);
Console.WriteLine(string.Join(", ", original)); // 3, 1, 4, 1, 5(変更なし)
Console.WriteLine(string.Join(", ", sorted)); // 1, 1, 3, 4, 5
修正後は次の通りです。
dotnet run 3, 1, 4, 1, 5 1, 1, 3, 4, 5
概要
Array.Sort() と Array.Reverse() はどちらも元の配列を直接変更します。元の配列を保持したい場合は、あらかじめ Array.Copy() や Clone() でコピーを作成してから操作してください。
カスタムの並べ替え条件が必要な場合は、Array.Sort(array, Comparison<T> comparison) にラムダ式を渡す方法があります。
配列のコピーには『Array.IndexOf() / Array.Copy()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。