Categories: Cシャープ

C#で配列をソートする方法を徹底解説|基本から応用まで

C#のプログラミングで配列のソートは頻繁に登場する処理の一つです。
たとえば、データの表示順を整えたいときや、数値の大小比較をしたいときに欠かせません。
この記事では、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.SortArray.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には比較ロジックを渡すことができ、柔軟な並べ替えが可能です。


多次元配列やListとの違いと注意点

C#ではList<T>もよく使われますが、List<T>は可変長であり、ソートにはSort()メソッドが使えます。

List<int> numbers = new List<int> { 5, 3, 8, 1, 4 };
numbers.Sort(); // 昇順
numbers.Reverse(); // 降順

一方、多次元配列(例:int[,])では、直接のソートはできず、加工して一時的な一次元配列に変換する必要があります。


LINQを使ったスマートなソート方法

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やカスタム比較を使うことで、より高度な処理が可能になります。

ソートはプログラムの中でも非常に基本的かつ重要な処理です。目的に応じて適切な方法を選び、効率よくデータを扱っていきましょう。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。