C#

【C#】LINQのOrderByに複数のキーを指定する方法

C#ではLINQを使いこなせるようになることは重要です。中でもOrderByはキーに対して要素をソートすることができるので割と重宝します。さらに、複数のキーを設定してソートする方法を知っておくとより便利になります。

//元ネタのリスト
var list = new List<Value>()
{
    new Value(1, "C"),
    new Value(2, "B"),
    new Value(1, "B"),
    new Value(2, "A"),
    new Value(1, "A"),
    new Value(3, "A"),
};

//昇順にソート
Console.WriteLine("【昇順】");
var sorted = list
    .OrderBy(x => x.Id)
    .ThenBy(x => x.Name)
    .ToList();
sorted.ForEach(x => Console.WriteLine($"Id:{x.Id}, Name:{x.Name}"));

Console.WriteLine();

//降順にソート
Console.WriteLine("【降順】");
var sortedDesc = list
    .OrderByDescending(x => x.Id)
    .ThenByDescending(x => x.Name)
    .ToList();
sortedDesc.ForEach(x => Console.WriteLine($"Id:{x.Id}, Name:{x.Name}"));

public class Value
{
    public int Id { get; }
    public string Name { get; set; }
    public Value(int id, string name)
    {
        Id = id;
        Name = name;
    }
}

クラス定義も含んでいるため若干ソースが長くなってしまっていますが、OrderByに複数のキーを設定するには、メソッドチェインで ThenBy をつないでいくだけです。昇順のサンプルでは Id でソートした後、Name でもソートしています。

【昇順】
Id:1, Name:A
Id:1, Name:B
Id:1, Name:C
Id:2, Name:A
Id:2, Name:B
Id:3, Name:A

【降順】
Id:3, Name:A
Id:2, Name:B
Id:2, Name:A
Id:1, Name:C
Id:1, Name:B
Id:1, Name:A

実行結果は上記の通りです。OrderBy / OrderByDescending の昇順・降順に対してソートキーを追加する場合は、 ThenBy / ThenByDescending を使用することで実現することができます。複数で並び変えられるので覚えておいて損はないと思います。

古川 智大

GENESIS株式会社の代表取締役。東京でエンジニアとなった後、奈良県に移住してフリーランスエンジニアとして開業。2023年4月より奈良県を拠点としたGENESIS株式会社を創業。主にビジネスロジックを扱うミドルウェアの開発を主戦場としています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Back to top button