たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

【C#】複数キーによるソートの方法

下記にて、複数キーでのソートを行う必要があり、その時にとった手法についてまとめます。少し実装にハマって時間を使ってしまったのでメモとして残しておきます。

atcoder.jp

やりたいこと

  • 複数の値をもつことができるデータを用意
  • そのデータの各値によってソートを行う

実装

List<Tuple<int, int, int>> tupleList = new List<Tuple<int, int, int>>(); // int を3つ持つTupleのリストを作成
for (int i = 0; i < M; i++)
{
    py = Console.ReadLine().Split(); // 標準入力では"a b"が 与えられている
    tupleList.Add(Tuple.Create(i, int.Parse(py[0]), int.Parse(py[1]))); // Tupleを使用して、3つの値を一つのデータにまとめる
}
var newList = tupleList.OrderBy(x => x.Item2).ThenBy(x => x.Item3); // ソートする

最後ソートの部分では、"OrderBy(x => x.Item2)" でTupleの2つ目の値をキーにソートして、さらにそれを "ThenBy(x => x.Item3)" で3つ目の値を2つ目のキーにしてソートしている。

結果

このようになる。Tupleでは、最初の値がforを回した時のIndexの値で、2つ目と3つ目がInputから与えられた値です。

--- input ---
1 32
2 63
1 12

--- output ---
(2, 1, 12)
(0, 1, 32)
(1, 2, 63)

2つめの値でソートされており、さらに3つ目の値でもソートされていることがわかります。

まとめ

問題として、複数の値・複数キーでソートがきたら上記手法を使えば良いです