【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では、WhereOrderByの順で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メソッドです。OrderByDescendingThenByと組み合わせることで、降順や複数条件の並び替えも簡単に実現できます。メソッド構文・クエリ構文の違いや、List.Sortとの使い分けを理解することで、実務でも効率的に並び替え処理を行うことができます。