【C#】LINQの OrderBy に複数キー(複数条件)を指定してソートする方法

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

この記事では昇順に並び替える OrderBy と OrderByDescending の二つを例として、複数の条件でソートする方法のサンプルを紹介していきます。サンプルで利用するクラスの定義は以下のようにしておきます。

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

int 型の Id と string 型 の Name を持っているクラスです。Id と Name を使ってソートのサンプルを作っていきます。

OrderBy / ThenBy のサンプル

昇順に並び替えを行うには OrderBy を使用します。キーを追加する場合は ThenBy でソート条件を追加すればOKです。

//元ネタのリスト
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}"));

OrderBy で最初のキーでソートさせ、ThenBy で二つ目のキーを指定することが出来ます。上記の実行結果は以下のようになります。まずは Id でソートされ、その次に同一の Id の中で ThenBy で指定したキーでソートを行っていることが分かります。

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

OrderByDescending / ThenByDescending のサンプル

降順に並び替えを行うには OrderByDescending を使用します。キーを追加する場合は ThenByDiscending でソート条件を追加すればOKです。

//元ネタのリスト
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 sortedDesc = list
    .OrderByDescending(x => x.Id)
    .ThenByDescending(x => x.Name)
    .ToList();
sortedDesc.ForEach(x => Console.WriteLine($"Id:{x.Id}, Name:{x.Name}"));

上記の実行結果は以下のようになります。まずは Id で降順にソートされ、さらに同一の Id 内で降順にソートされていることが分かります。

【降順】
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 を使うことで、並び替えの処理に対して条件を複数にすることが出来ます。計算量が多くなるため大きなデータセットに対する処理は速度懸念がありますが、知っておくと便利であることは間違いありません。