Enumerable.OrderBy() / OrderByDescending()
| 対応: | C# 3.0(2007) |
|---|
シーケンスの要素を昇順・降順に並べ替える LINQ の拡張メソッドです。複数のキーで並べ替える『ThenBy()』と合わせて解説します。
構文
using System.Linq;
// 昇順に並べ替えます。
IOrderedEnumerable<T> asc = source.OrderBy(x => キー);
// 降順に並べ替えます。
IOrderedEnumerable<T> desc = source.OrderByDescending(x => キー);
// 第 2・第 3 キーを追加します(OrderBy の後に続けます)。
IOrderedEnumerable<T> multi = source.OrderBy(x => 第1キー)
.ThenBy(x => 第2キー)
.ThenByDescending(x => 第3キー);
メソッド一覧
| メソッド | 概要 |
|---|---|
| OrderBy(keySelector) | 指定したキーで昇順に並べ替えます。 |
| OrderByDescending(keySelector) | 指定したキーで降順に並べ替えます。 |
| ThenBy(keySelector) | 直前の並べ替えが同順のとき、追加キーで昇順に並べ替えます。 |
| ThenByDescending(keySelector) | 直前の並べ替えが同順のとき、追加キーで降順に並べ替えます。 |
| Reverse() | シーケンスの要素順を逆にします(ソートではありません)。 |
サンプルコード
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
List<int> numbers = new List<int> { 5, 1, 8, 3, 9, 2 };
// 昇順に並べ替えます。
IEnumerable<int> asc = numbers.OrderBy(n => n);
Console.WriteLine(string.Join(", ", asc)); // 1, 2, 3, 5, 8, 9
// 降順に並べ替えます。
IEnumerable<int> desc = numbers.OrderByDescending(n => n);
Console.WriteLine(string.Join(", ", desc)); // 9, 8, 5, 3, 2, 1
// オブジェクトのリストをプロパティで並べ替えます。
var fighters = new List<(string Name, int Age)>
{
("テリー・ボガード", 24),
("草薙京", 20),
("八神庵", 20),
("ブルー・マリー", 23),
};
// 年齢の昇順に並べ替えます。
var byAge = fighters.OrderBy(f => f.Age);
foreach (var f in byAge)
Console.WriteLine($"{f.Name}: {f.Age}歳");
// 年齢の昇順、同じ年齢は名前の昇順で並べ替えます。
var byAgeAndName = fighters.OrderBy(f => f.Age)
.ThenBy(f => f.Name);
foreach (var f in byAgeAndName)
Console.WriteLine($"{f.Name}: {f.Age}歳");
// 文字列を長さの降順、長さが同じ場合はアルファベット順に並べ替えます。
List<string> names = new List<string> { "八神庵", "テリー・ボガード", "ゲーニッツ", "ブルー・マリー", "草薙京" };
var sorted = names.OrderByDescending(n => n.Length).ThenBy(n => n);
Console.WriteLine(string.Join(", ", sorted)); // テリー・ボガード, ブルー・マリー, ゲーニッツ, 八神庵, 草薙京
dotnet script enumerable_orderby.csx 1, 2, 3, 5, 8, 9 9, 8, 5, 3, 2, 1 草薙京: 20歳 八神庵: 20歳 ブルー・マリー: 23歳 テリー・ボガード: 24歳 草薙京: 20歳 八神庵: 20歳 ブルー・マリー: 23歳 テリー・ボガード: 24歳 テリー・ボガード, ブルー・マリー, ゲーニッツ, 八神庵, 草薙京
概要
『OrderBy()』系のメソッドは安定ソート(Stable Sort)で動作します。つまり同じキー値を持つ要素の元の順序が保たれます。
『OrderBy()』の後に再び『OrderBy()』を続けると前の並べ替えが無効になります。複数キーで並べ替えたい場合は必ず『ThenBy()』を使ってください。また、並べ替えは新しいシーケンスを返すため元のコレクションは変更されません。
並べ替え後の先頭や末尾の要素を取得したい場合は『Enumerable.First() / Last()』を参照してください。グループ化した上で並べ替えを行う場合は『Enumerable.GroupBy()』と組み合わせて使います。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。