【C#】OrderByの使い方を徹底解説|LINQで昇順・降順・複数条件の並び替えをする方法
はじめに
C#でコレクションの並び替えを行う際、最もよく使われるのがLINQのOrderByメソッドです。数値や文字列、オブジェクトのプロパティを簡単に昇順・降順で並び替えでき、複数条件でのソートも柔軟に対応できます。本記事では、「c# order」というキーワードで検索する方に向けて、OrderByの基本から実践的な使い方まで徹底解説します。
1. C#のOrderByとは?LINQで並び替えを行う基本
1-1. OrderByはコレクションを昇順に並び替えるLINQメソッド
OrderByはLINQの拡張メソッドで、コレクションの要素を指定したキーに基づき昇順に並び替えます。元のリストを変更せず、新しいシーケンスを返す点が特徴です。
C#var numbers = new List<int> { 3, 1, 4, 2 };
var sortedNumbers = numbers.OrderBy(n => n);
1-2. 「c# order」で検索する人が知りたいOrderBy・orderby句の違い
メソッド構文のOrderByと、クエリ構文のorderbyは同じく並び替えを行います。主な違いは書き方のスタイルです。
C#// メソッド構文
var sorted = numbers.OrderBy(n => n);
// クエリ構文
var sortedQuery = from n in numbers
orderby n
select n;
1-3. OrderByを使うために必要なusing System.Linq
OrderByはLINQの拡張メソッドなので、ファイルの先頭に次を追加する必要があります。
C#using System.Linq;
1-4. OrderByは元のListを変更せず、新しい並び順を返す
OrderByは元のコレクションを変更せず、新しい並び順のシーケンスを返すため、元の順序を保持したい場合に便利です。
2. OrderByの基本的な使い方
2-1. 数値を昇順に並び替える基本コード
C#var numbers = new List<int> { 5, 2, 8, 1 };
var sorted = numbers.OrderBy(n => n).ToList();
2-2. 文字列をアルファベット順・五十音順に並び替える
C#var fruits = new List<string> { "バナナ", "りんご", "みかん" };
var sortedFruits = fruits.OrderBy(f => f).ToList();
2-3. オブジェクトのプロパティを指定して並び替える
C#var people = new List<Person>
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 }
};
var sortedByAge = people.OrderBy(p => p.Age).ToList();
2-4. ToList・ToArrayで結果をListや配列に変換する
OrderByの結果はIEnumerable<T>です。必要に応じてToList()やToArray()で変換します。
3. OrderByDescendingで降順に並び替える方法
3-1. 数値を大きい順に並び替える
C#var sortedDesc = numbers.OrderByDescending(n => n).ToList();
3-2. 日付を新しい順に並び替える
C#var dates = new List<DateTime> { DateTime.Now, DateTime.Now.AddDays(-1) };
var sortedDates = dates.OrderByDescending(d => d).ToList();
3-3. オブジェクトのプロパティを降順で並び替える
C#var sortedPeople = people.OrderByDescending(p => p.Age).ToList();
3-4. OrderByとOrderByDescendingの使い分け
昇順はOrderBy、降順はOrderByDescendingを使い分けます。直感的に理解しやすく、可読性が高いです。
4. ThenBy・ThenByDescendingで複数条件の並び替えをする方法
4-1. 複数条件の並び替えにはThenByを使う
複数条件で並び替える場合、2つ目以降の条件にはThenByを使います。
4-2. 第1条件はOrderBy、第2条件以降はThenByで指定する
C#var sortedPeople = people.OrderBy(p => p.Age).ThenBy(p => p.Name).ToList();
4-3. 昇順と降順を組み合わせて並び替える
C#var sortedMixed = people.OrderBy(p => p.Age).ThenByDescending(p => p.Name).ToList();
4-4. OrderByを連続で使ってはいけない理由
OrderByを連続で使用すると、前の並び替え条件が上書きされます。複数条件には必ずThenByを使いましょう。
4-5. 複数プロパティで並び替える実践コード
C#var sorted = people.OrderBy(p => p.Age)
.ThenBy(p => p.Name)
.ThenByDescending(p => p.JoinDate)
.ToList();
5. query構文のorderby句で並び替える方法
5-1. メソッド構文とquery構文の違い
OrderByはメソッド構文、orderbyはクエリ構文で書くスタイルの違いだけです。
5-2. orderbyで昇順に並び替える
C#var sortedQuery = from p in people
orderby p.Age
select p;
5-3. orderby descendingで降順に並び替える
C#var sortedQueryDesc = from p in people
orderby p.Age descending
select p;
5-4. orderbyで複数条件を指定する
C#var sortedMulti = from p in people
orderby p.Age, p.Name
select p;
5-5. OrderByとorderby句はどちらを使うべきか
チームでのコーディング規約や可読性に応じて使い分けます。メソッドチェーンが好きならOrderBy、SQLライクに書きたいならorderbyが適しています。
6. よく使うOrderByの実践パターン
6-1. Listの要素を並び替える
Listの整数や文字列を簡単に昇順・降順に並び替えられます。
6-2. 配列の要素を並び替える
配列もOrderByで新しい並び順の配列に変換できます。
C#int[] numbersArray = { 3, 1, 4 };
var sortedArray = numbersArray.OrderBy(n => n).ToArray();
6-3. DictionaryをKeyやValueで並び替える
C#var dict = new Dictionary<string, int> { {"a",2}, {"b",1} };
var sortedDict = dict.OrderBy(kv => kv.Value).ToList();
6-4. nullを含むデータを安全に並び替える
C#var names = new List<string?> { "Alice", null, "Bob" };
var sortedNames = names.OrderBy(n => n ?? string.Empty).ToList();
6-5. 大文字・小文字を区別せず文字列を並び替える
C#var sortedIgnoreCase = names.OrderBy(n => n, StringComparer.OrdinalIgnoreCase).ToList();
6-6. 独自の優先順位で並び替える
C#var customOrder = new List<string> { "high", "medium", "low" };
var sortedCustom = items.OrderBy(i => customOrder.IndexOf(i)).ToList();
7. OrderByでつまずきやすいポイントと注意点
7-1. OrderByだけでは元のListの順番は変わらない
元のリストは不変なので、ToList()で新しいリストに格納する必要があります。
7-2. ToListを忘れると期待した型にならない
IEnumerable<T>のままだと、配列やListとして扱えません。
7-3. ThenByではなくOrderByを再度使うと並び替え条件が上書きされる
複数条件を設定する場合、2つ目以降は必ずThenByを使用します。
7-4. null値がある場合の並び順に注意する
nullがあると例外や予期せぬ順序になることがあるため、??演算子や比較器を使って安全に並び替えましょう。
7-5. LINQ to ObjectsとEntity Frameworkで挙動が異なる場合がある
データベースに対してOrderByを使う場合、SQLに変換されるため、LINQ to Objectsとは若干挙動が異なることがあります。
8. OrderByとList.Sortの違い
8-1. OrderByはLINQで新しい並び順を作る
元のリストを変更せず、新しい並び順のシーケンスを返します。
8-2. List.Sortは元のList自体を並び替える
Sortはリストを破壊的に変更します。
8-3. 可読性・再利用性・パフォーマンスの違い
OrderByはチェーン可能で可読性が高く、Sortは破壊的でパフォーマンスが若干良い場合があります。
8-4. OrderByとList.Sortの使い分け
元のデータを保持したい場合はOrderBy、大量データで高速性を重視する場合はSortを選びます。
9. OrderByのパフォーマンスと実務での使い方
9-1. 大量データを並び替えるときの注意点
大量データではOrderByの計算コストが増すため、必要最低限の範囲で使用するのが望ましいです。
9-2. Whereで絞り込んでからOrderByする
C#var filteredSorted = numbers.Where(n => n > 5).OrderBy(n => n).ToList();
9-3. データベース検索ではOrderByの位置に注意する
EF Coreでは、Where→OrderByの順でSQLに変換されるため、不要な並び替えを避けられます。
9-4. ページング処理ではOrderByとSkip・Takeを組み合わせる
C#var page = people.OrderBy(p => p.Age).Skip(10).Take(5).ToList();
10. C#のOrderByに関するよくある質問
10-1. OrderByで降順にするにはどうすればいい?
OrderByDescendingを使うことで簡単に降順に並び替えられます。
10-2. OrderByで複数条件を指定するには?
第1条件はOrderBy、第2条件以降はThenByで指定します。
10-3. OrderByとThenByの違いは?
OrderByは最初の並び替え条件、ThenByは第2条件以降の並び替えに使用します。
10-4. OrderByとorderby句の違いは?
メソッド構文がOrderBy、クエリ構文がorderbyであり、機能はほぼ同じです。
10-5. OrderByで元のListを直接並び替えられる?
OrderByは元のListを変更せず、新しい並び順を返すので直接並び替えはできません。
10-6. OrderByでnullを最後に並び替えるには?
C#var sorted = names.OrderBy(n => n == null).ThenBy(n => n).ToList();
まとめ
C#のOrderByは、数値・文字列・オブジェクトのプロパティを昇順で並び替える強力なLINQメソッドです。OrderByDescendingやThenByと組み合わせることで、降順や複数条件の並び替えも簡単に実現できます。メソッド構文・クエリ構文の違いや、List.Sortとの使い分けを理解することで、実務でも効率的に並び替え処理を行うことができます。

