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