List<T>のソート(並べ替え)
C#のList<T>(ジェネリックリスト)は、データを動的に追加・削除できるため非常に便利ですが、格納されたデータを特定の順序(例: 数値の小さい順、アルファベット順)に並べ替えたい(ソートしたい)という要求も頻繁に発生します。
List<T>クラスは、この並べ替え操作を簡単に行うためのSortというインスタンスメソッドを提供しています。
List<T>.Sort() メソッド
List<T>.Sort()メソッドは、リスト内の要素を、その型が持つデフォルトの比較ルール(intなら数値の大小、stringなら辞書順)に従って昇順に並べ替えます。
重要な特性:インプレース(In-Place)操作
List<T>.Sort()メソッドは、Array.Sortと同様に、**インプレース(In-Place)**で動作します。
これは、Sort()メソッドが新しいリストを生成して返すのではなく、メソッドを呼び出した元のList<T>インスタンス自体を直接変更する(中身を書き換える)ことを意味します。このメソッドの戻り値はvoid(何も返さない)です。
var numbers = new List<int> { 5, 1, 3 };
// numbers リスト自体が { 1, 3, 5 } に書き換わる
numbers.Sort();
// 戻り値は void なので、以下のような記述はできない
// var sortedList = numbers.Sort(); // コンパイルエラー
(注: 元のリストを変更せず、新しいソート済みシーケンスを取得したい場合は、LINQのOrderBy()メソッドを使用します。)
コード例1:List<string>(文字列)の昇順ソート
List<string>に対してSort()を実行すると、アルファベット順(辞書順)に並べ替えられます。
using System;
using System.Collections.Generic;
public class ListSortStringExample
{
public static void Main()
{
// 1. 元の文字列リストを定義
var categories = new List<string>
{
"Monitors",
"Keyboards",
"Cables",
"Adapters"
};
Console.WriteLine("--- 実行前 (文字列) ---");
PrintList(categories);
// 2. Sort() を呼び出し (元のリストが変更される)
categories.Sort();
Console.WriteLine("\n--- 実行後 (アルファベット順) ---");
PrintList(categories);
}
// リストの要素を出力するヘルパーメソッド
private static void PrintList(List<string> list)
{
foreach (var item in list)
{
Console.WriteLine(item);
}
}
}
出力結果:
--- 実行前 (文字列) ---
Monitors
Keyboards
Cables
Adapters
--- 実行後 (アルファベット順) ---
Adapters
Cables
Keyboards
Monitors
コード例2:List<int>(数値)の昇順ソート
List<int>に対してSort()を実行すると、数値の小さい順(昇順)に並べ替えられます。
using System;
using System.Collections.Generic;
public class ListSortNumericExample
{
public static void Main()
{
// 1. 元の数値リストを定義
var scores = new List<int> { 95, 70, 100, 82, 91 };
Console.WriteLine("--- 実行前 (数値) ---");
PrintList(scores);
// 2. Sort() を呼び出し (元のリストが変更される)
scores.Sort();
Console.WriteLine("\n--- 実行後 (昇順) ---");
PrintList(scores);
}
// リストの要素を出力するヘルパーメソッド
private static void PrintList(List<int> list)
{
Console.WriteLine(string.Join(", ", list));
}
}
出力結果:
--- 実行前 (数値) ---
95, 70, 100, 82, 91
--- 実行後 (昇順) ---
70, 82, 91, 95, 100
補足:降順(大きい順)に並べ替える方法
List<T>.Sort()メソッドは、それ単体では昇順にしか並べ替えられません。
もし降順(大きい順、または辞書順の逆)に並べ替えたい場合は、Sort()を実行した後で、List<T>.Reverse()(リストを逆順にする)メソッドを呼び出すのが最も一般的なテクニックです。Reverse()メソッドもインプレースで動作します。
コード例3:降順ソート(Sort + Reverse)
using System;
using System.Collections.Generic;
public class ListSortDescendingExample
{
public static void Main()
{
var scores = new List<int> { 95, 70, 100, 82, 91 };
Console.WriteLine("--- 実行前 ---");
PrintList(scores);
// 1. まず昇順にソートする (70, 82, 91, 95, 100)
scores.Sort();
// 2. 昇順になったリストを、さらに逆順にする
scores.Reverse();
Console.WriteLine("\n--- 実行後 (降順) ---");
PrintList(scores);
}
private static void PrintList(List<int> list)
{
Console.WriteLine(string.Join(", ", list));
}
}
出力結果:
--- 実行前 ---
95, 70, 100, 82, 91
--- 実行後 (降順) ---
100, 95, 91, 82, 70
まとめ
List<T>.Sort()メソッドは、List<T>の要素を「インプレース(元のリストを変更)」で「昇順」に並べ替えるための、最も基本的なインスタンスメソッドです。
int、stringなど、比較可能な多くの型に対して機能します。降順にソートしたい場合は、Sort()の後にReverse()を組み合わせて使用します。
