C#のプログラミングで配列のソートは頻繁に登場する処理の一つです。
たとえば、データの表示順を整えたいときや、数値の大小比較をしたいときに欠かせません。
この記事では、C#における配列の基本的なソート方法から、カスタムソート、複数条件での並び替えなど応用的なテクニックまでを丁寧に解説します。
初心者の方でもわかりやすいよう、コード例を交えて説明しますので、ぜひ最後までご覧ください。
C#では、配列は同じデータ型の要素をまとめて扱うための仕組みです。
例えば、以下のように宣言します。
int[] numbers = new int[] { 5, 3, 8, 1, 4 };
この配列には整数値が5つ格納されており、0から始まるインデックスでアクセスできます。
配列の要素は固定されており、要素数をあとから増減することはできません。
最も基本的なソートは、Array.Sort
メソッドを使った方法です。これは昇順(小さい値から大きい値)に並び替える処理です。
int[] numbers = new int[] { 5, 3, 8, 1, 4 };
Array.Sort(numbers);
foreach (int num in numbers)
{
Console.WriteLine(num);
}
このコードを実行すると、1, 3, 4, 5, 8
の順に表示されます。Array.Sort
はアルゴリズムとしてクイックソートをベースにしており、効率よく処理されます。
降順(大きい値から小さい値)に並べたいときは、Array.Sort
とArray.Reverse
を組み合わせるのが一般的です。
int[] numbers = new int[] { 5, 3, 8, 1, 4 };
Array.Sort(numbers);
Array.Reverse(numbers);
foreach (int num in numbers)
{
Console.WriteLine(num);
}
または、LINQを使って簡潔に書くことも可能です。
int[] numbers = new int[] { 5, 3, 8, 1, 4 };
var sorted = numbers.OrderByDescending(n => n).ToArray();
foreach (int num in sorted)
{
Console.WriteLine(num);
}
LINQの記述は直感的で可読性も高いため、業務でも多用されています。
文字列の配列も同様にArray.Sort
でソートできます。以下は文字列を昇順に並べ替える例です。
string[] names = new string[] { "Tanaka", "Suzuki", "Yamada", "Aoki" };
Array.Sort(names);
foreach (string name in names)
{
Console.WriteLine(name);
}
この場合、アルファベット順(または日本語の場合はUnicode順)で並びます。
例えば「文字列の長さが短い順」に並べたい場合は、Array.Sort
とカスタム比較関数を使います。
string[] words = { "apple", "banana", "kiwi", "grape" };
Array.Sort(words, (a, b) => a.Length.CompareTo(b.Length));
foreach (var word in words)
{
Console.WriteLine(word);
}
結果は、kiwi, grape, apple, banana
の順になります。
このように、Array.Sort
には比較ロジックを渡すことができ、柔軟な並べ替えが可能です。
C#ではList<T>
もよく使われますが、List<T>
は可変長であり、ソートにはSort()
メソッドが使えます。
List<int> numbers = new List<int> { 5, 3, 8, 1, 4 };
numbers.Sort(); // 昇順
numbers.Reverse(); // 降順
一方、多次元配列(例:int[,]
)では、直接のソートはできず、加工して一時的な一次元配列に変換する必要があります。
LINQを使うと、コードがより宣言的になり、ソート処理がスマートに記述できます。
int[] numbers = { 7, 2, 9, 1, 6 };
var sortedAsc = numbers.OrderBy(n => n).ToArray();
var sortedDesc = numbers.OrderByDescending(n => n).ToArray();
さらに、複数条件でのソートも可能です。
var people = new[]
{
new { Name = "Tanaka", Age = 30 },
new { Name = "Yamada", Age = 25 },
new { Name = "Tanaka", Age = 20 }
};
var sorted = people.OrderBy(p => p.Name).ThenBy(p => p.Age);
foreach (var person in sorted)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
このようにThenBy
を使うと、第二条件・第三条件のような多段階ソートも簡単に実現できます。
配列のソートでは以下の点に注意してください:
null
の存在でNullReferenceException
になることがあるLINQのOrderBy
は新しい配列を生成するため、元の配列を残しておきたいときに便利です。
C#で配列をソートする方法は豊富に用意されています。
基本的にはArray.Sort
で十分対応できますが、柔軟性が求められる場合にはLINQ
やカスタム比較を使うことで、より高度な処理が可能になります。
ソートはプログラムの中でも非常に基本的かつ重要な処理です。目的に応じて適切な方法を選び、効率よくデータを扱っていきましょう。