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 を使用することで実現することができます。複数で並び変えられるので覚えておいて損はないと思います。