本文へスキップ
BecomeCoder

C#文法コース · 第5章 LINQ · レッスン40

並べ替え(OrderBy・ThenBy)

ブラウザで完結

導入

「価格の安い順」「名前のあいうえお順」——コレクションを並べ替えるのがOrderByです。降順にしたり、同点のときの第2キーを指定したりもできます。

図解

flowchart LR
    IN["[30, 10, 20]"] --> O["OrderBy(n => n)<br/>昇順"]
    O --> OUT["[10, 20, 30]"]
    IN --> OD["OrderByDescending<br/>降順"]
    OD --> OUT2["[30, 20, 10]"]

サンプル

int[] nums = { 30, 10, 20 };

// OrderBy: 昇順(小さい順)
var asc = nums.OrderBy(n => n);
Console.WriteLine(string.Join(", ", asc));   // 10, 20, 30

// OrderByDescending: 降順(大きい順)
var desc = nums.OrderByDescending(n => n);
Console.WriteLine(string.Join(", ", desc));  // 30, 20, 10

// 文字列を長さ順、同じ長さなら辞書順(ThenBy)に
string[] words = { "bb", "a", "cc", "d" };
var sorted = words.OrderBy(w => w.Length).ThenBy(w => w);
Console.WriteLine(string.Join(", ", sorted));  // a, d, bb, cc
  • OrderBy(要素 => キー)で昇順、OrderByDescendingで降順
  • ThenBy / ThenByDescendingで「同点のときの第2キー」を指定
  • 元のコレクションは変更されず、並べ替えた結果が返る

演習

int[] scores = { 72, 95, 60, 88 };

// TODO: 点数の高い順(降順)に並べ、string.Join でカンマ区切り出力してください
//       (95, 88, 72, 60)
___
  • 期待される出力: 95, 88, 72, 60
ヒント1を見る

OrderByDescending(s => s)

ヒント2を見る

Console.WriteLine(string.Join(", ", scores.OrderByDescending(s => s)));

まとめ

  • OrderByで昇順、OrderByDescendingで降順に並べ替え
  • ThenByで第2キー(同点時の順序)を指定
  • 元のコレクションは変わらず、並べ替え結果が返る

次回: 要素をグループにまとめるGroupByです。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。