Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Enumerable.OrderBy() / OrderByDescending()
シーケンスの要素を昇順・降順に並べ替える 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() | シーケンスの要素順を逆にします(ソートではありません)。 |
サンプルコード
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 people = new List<(string Name, int Age)>
{
("田中", 30),
("鈴木", 25),
("佐藤", 30),
("山田", 20),
};
// 年齢の昇順に並べ替えます。
var byAge = people.OrderBy(p => p.Age);
foreach (var p in byAge)
Console.WriteLine($"{p.Name}: {p.Age}歳");
// 年齢の昇順、同じ年齢は名前の昇順で並べ替えます。
var byAgeAndName = people.OrderBy(p => p.Age)
.ThenBy(p => p.Name);
foreach (var p in byAgeAndName)
Console.WriteLine($"{p.Name}: {p.Age}歳");
// 文字列を長さの降順、長さが同じ場合はアルファベット順に並べ替えます。
List<string> fruits = new List<string> { "fig", "apple", "banana", "kiwi", "plum" };
var sorted = fruits.OrderByDescending(f => f.Length).ThenBy(f => f);
Console.WriteLine(string.Join(", ", sorted)); // banana, apple, kiwi, plum, fig
概要
『OrderBy()』系のメソッドは安定ソート(Stable Sort)で動作します。つまり同じキー値を持つ要素の元の順序が保たれます。
『OrderBy()』の後に再び『OrderBy()』を続けると前の並べ替えが無効になります。複数キーで並べ替えたい場合は必ず『ThenBy()』を使ってください。また、並べ替えは新しいシーケンスを返すため元のコレクションは変更されません。
並べ替え後の先頭や末尾の要素を取得したい場合は『Enumerable.First() / Last()』を参照してください。グループ化した上で並べ替えを行う場合は『Enumerable.GroupBy()』と組み合わせて使います。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。