HOWTO · Csharp

C# でアルファベット順にリストを並べ替える

この記事では、C# でリストをアルファベット順に並べ替える方法を示します。

このページの内容

C# でリストをアルファベット順に並べ替えるには、List<T> に Sort() を呼び出します。文字列の場合、リストの既定の比較子を使って値を並べます。オブジェクトのリストでは、並べ替えの基準にするプロパティを読み取る比較処理を指定します。Sort() は既存のリスト内で要素を並べ替えるため、その後も同じリストを出力できます。

文字列のリストをアルファベット順に並べ替える

List<string> には既定の比較子があるため、文字列の並べ替えに別の比較関数は必要ありません。この比較子は現在のカルチャに応じた文字列比較を行います。一般的な英単語なら、次の例では名前がアルファベット順に並びます。アクセント付き文字など、カルチャの影響を受ける文字の相対的な順序は、カルチャの規則によって変わることがあります。アプリケーションでカルチャに依存しない順序が必要な場合は、明示的な比較方法を使ってください。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var words = new List<string> { "Pear", "Apple", "Orange" };
        words.Sort();

        foreach (string word in words)
        {
            Console.WriteLine(word);
        }
    }
}

出力される名前は Apple、Orange、Pear の順で、それぞれ別の行に表示されます。この呼び出しは words をその場で並べ替えます。変数が参照するリストは同じですが、要素の順序が変わります。後続のコードで並べ替えた列を使う場合に便利です。元の順序も残す必要がある場合は、Sort() を呼び出す前にリストをコピーしてください。

選択したプロパティでオブジェクトを並べ替える

オブジェクトを並べ替えるには、Sort() に渡す比較デリゲートでプロパティを選びます。デリゲートにはリストの要素が2つ渡され、1つ目を先に置く場合は負の値、キーが等しい場合は0、1つ目を後に置く場合は正の値を返します。ここでは StringComparison.Ordinal を使い、現在のカルチャの言語規則を適用せず、UTF-16 コード単位に基づく一貫した序数順で名前を並べます。特定の読者向けに表示する順序が必要な場合は、代わりにカルチャに応じた比較子を選んでください。

このセクションのコードと表示されるラベルや出力は英語のままです。

using System;
using System.Collections.Generic;

class Person
{
    public string Name { get; }

    public Person(string name) => Name = name;
}

class Program
{
    static void Main()
    {
        var people = new List<Person>
        {
            new Person("Maya"),
            new Person("Alex"),
            new Person("Jordan")
        };

        people.Sort((left, right) =>
            string.Compare(left.Name, right.Name, StringComparison.Ordinal));

        foreach (Person person in people)
        {
            Console.WriteLine(person.Name);
        }
    }
}

デリゲートに渡される値はどちらも Person オブジェクトですが、比較に使うのは Name の値だけです。別の種類のオブジェクトを並べ替える場合は、Name を順序を決めるプロパティに置き換え、そのプロパティの型に適した比較子を使います。名前が同じ人同士は、この比較では等しいものとして扱われます。二次的な順序が必要な場合に限り、追加の比較条件を指定してください。リストは List<Person> のままで、要素が新しいコレクションにコピーされるのではなく、リスト内で並べ替えられます。

並べ替えたリストを出力する

並べ替えによる変化を確認するには、並べ替えの前後に値を出力します。この例では、3つの名前を含むリストを用意し、元の順序を出力してから同じリストを並べ替え、新しい順序を出力します。foreach はリストの現在の順序に従って各要素を処理しますが、それ自体は並べ替えを行いません。順序を変えるのは Sort() の呼び出しです。コード内の Before sorting: と After sorting: という表示ラベルは、出力でも英語のままです。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var names = new List<string> { "Mina", "Eli", "Noah" };

        Console.WriteLine("Before sorting:");
        foreach (string name in names)
        {
            Console.WriteLine(name);
        }

        names.Sort();

        Console.WriteLine("After sorting:");
        foreach (string name in names)
        {
            Console.WriteLine(name);
        }
    }
}

最初のループは、表示時に追加された順序を保ちます。names.Sort() を呼び出した後、2つ目のループは既定の文字列比較子で決まった順序でリストを処理します。コンソールアプリケーションで結果を確認する場合は、Console.WriteLine の呼び出しを残してください。別のプログラムでは、並べ替えたリストを次の処理に直接渡すこともできます。これらの例では、2つの並べ替え方を理解するために必要なインポート、プロパティ、セットアップだけを使っています。