基礎から学ぶC#入門 90日コース | 実践的なC#プログラミング - Day 57:LINQ検索・並び替え

C# 90日で身につけるC#
スポンサーリンク
スポンサーリンク

Day 57 のゴールと全体像

Day 57 では、LINQ を使った「検索」と「並び替え」をテーマにします。 今日のキーワードは次の5つです。

  • OrderBy
  • OrderByDescending
  • First
  • FirstOrDefault
  • Any

昨日の Day 56 で学んだ WhereSelect は、 「絞り込み」と「変換」でした。

そこに今日の5つを組み合わせることで、

  • 並び替える
  • 先頭の1件を取り出す
  • 条件に合うものが“あるかどうか”を調べる

といった、実務でもよく使う“検索系の処理”を、 とても読みやすいコードで書けるようになっていきます。

肩の力を抜いて、順番に見ていきましょう。

OrderBy ― 昇順に並び替える

OrderBy の役割

OrderBy は、

指定したキーをもとに、昇順(小さい順・辞書順)に並び替える

ためのメソッドです。

基本形のテンプレート

コレクション.OrderBy(x => 並び替えの基準)
C#
  • x:1つずつ取り出される要素
  • 並び替えの基準:数値や文字列など、「比較できる値」

例1:数字を小さい順に並び替える

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var numbers = new[] { 5, 1, 8, 3, 2 };

        // 数字を昇順(小さい順)に並び替える
        var ordered = numbers.OrderBy(n => n);

        Console.WriteLine("昇順に並び替えた結果:");

        foreach (var n in ordered)
        {
            Console.WriteLine(n);
        }
    }
}
C#

コードのポイント

  • OrderBy(n => n) は「n 自身を基準に並び替える」という意味です。
  • 数字の場合は、そのまま n を返せば「小さい順」に並びます。

例2:文字列を辞書順に並び替える

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var names = new[] { "山田", "佐藤", "鈴木", "田中" };

        // 名前を辞書順に並び替える
        var orderedNames = names.OrderBy(name => name);

        Console.WriteLine("名前を辞書順に並び替えた結果:");

        foreach (var name in orderedNames)
        {
            Console.WriteLine(name);
        }
    }
}
C#

文字列の場合も、 OrderBy(name => name) で「辞書順」に並び替えられます。

OrderByDescending ― 降順に並び替える

OrderByDescending の役割

OrderByDescending は、

指定したキーをもとに、降順(大きい順・逆順)に並び替える

ためのメソッドです。

基本形のテンプレート

コレクション.OrderByDescending(x => 並び替えの基準)
C#

例1:数字を大きい順に並び替える

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var numbers = new[] { 5, 1, 8, 3, 2 };

        // 数字を降順(大きい順)に並び替える
        var orderedDesc = numbers.OrderByDescending(n => n);

        Console.WriteLine("降順に並び替えた結果:");

        foreach (var n in orderedDesc)
        {
            Console.WriteLine(n);
        }
    }
}
C#

例2:年齢の高い順にユーザーを並び替える

using System;
using System.Linq;
using System.Collections.Generic;

class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        var users = new List<User>
        {
            new User { Name = "山田太郎", Age = 25 },
            new User { Name = "佐藤花子", Age = 17 },
            new User { Name = "鈴木一郎", Age = 30 }
        };

        // 年齢の高い順に並び替える
        var orderedUsers = users.OrderByDescending(u => u.Age);

        Console.WriteLine("年齢の高い順に並び替えた結果:");

        foreach (var user in orderedUsers)
        {
            Console.WriteLine($"{user.Name} ({user.Age}歳)");
        }
    }
}
C#

コードのポイント

  • OrderByDescending(u => u.Age) で、「Age プロパティ」を基準に降順に並び替えています。
  • オブジェクトのプロパティを基準にできるのが、LINQ の強みです。

First ― 先頭の1件を取り出す

First の役割

First は、

コレクションの先頭の要素を1件だけ取り出す

ためのメソッドです。

基本形のテンプレート

コレクション.First()
コレクション.First(x => 条件)
C#
  • 引数なし:単純に先頭の要素を返す
  • 条件あり:条件に合うもののうち、最初の1件を返す

例1:単純に先頭の要素を取り出す

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var numbers = new[] { 10, 20, 30 };

        int first = numbers.First(); // 先頭の要素(10)を取得

        Console.WriteLine($"先頭の要素は {first} です。");
    }
}
C#

例2:条件に合う最初の1件を取り出す

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var numbers = new[] { 5, 12, 3, 18, 7 };

        // 10より大きい数字のうち、最初の1件を取得
        int firstOver10 = numbers.First(n => n > 10);

        Console.WriteLine($"10より大きい数字のうち、最初の1件は {firstOver10} です。");
    }
}
C#

注意点:該当する要素がないと例外になる

First は、

  • コレクションが空の場合
  • 条件に合う要素が1つもない場合

例外(エラー) を投げます。

そのため、 「ないかもしれない」前提で書きたいときは、 次に紹介する FirstOrDefault を使うほうが安全です。

FirstOrDefault ― 見つからなければ「既定値」を返す

FirstOrDefault の役割

FirstOrDefault は、

条件に合う最初の1件を返す ただし、見つからなければ「既定値(default)」を返す

というメソッドです。

基本形のテンプレート

コレクション.FirstOrDefault()
コレクション.FirstOrDefault(x => 条件)
C#

例1:条件に合うものがない場合の挙動

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var numbers = new[] { 1, 2, 3 };

        // 10より大きい数字は存在しない
        int result = numbers.FirstOrDefault(n => n > 10);

        Console.WriteLine($"結果は {result} です。");
    }
}
C#

この場合、

  • int 型の既定値は 0 なので、 result には 0 が入ります。

例2:参照型(クラス)の場合

using System;
using System.Linq;
using System.Collections.Generic;

class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        var users = new List<User>
        {
            new User { Name = "山田太郎", Age = 25 },
            new User { Name = "佐藤花子", Age = 17 }
        };

        // 年齢が30以上のユーザーを探す(存在しない)
        var user = users.FirstOrDefault(u => u.Age >= 30);

        if (user == null)
        {
            Console.WriteLine("30歳以上のユーザーは見つかりませんでした。");
        }
        else
        {
            Console.WriteLine($"{user.Name} さんが見つかりました。");
        }
    }
}
C#

コードのポイント

  • 参照型(クラス)の既定値は null です。
  • FirstOrDefault を使うときは、null チェックをセットで書くのが基本パターンです。

Any ― 条件に合うものが「1つでもあるか」を調べる

Any の役割

Any は、

条件に合う要素が1つでも存在するかどうか

を調べるメソッドです。

基本形のテンプレート

コレクション.Any()
コレクション.Any(x => 条件)
C#
  • 引数なし:コレクションが空でなければ true
  • 条件あり:条件に合うものが1つでもあれば true

例1:コレクションが空かどうかを調べる

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var numbers = new int[] { };

        bool hasAny = numbers.Any();

        Console.WriteLine(hasAny
            ? "要素があります。"
            : "要素がありません。");
    }
}
C#

例2:条件に合うものがあるかどうかを調べる

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var numbers = new[] { 1, 2, 3, 4, 5 };

        // 偶数が1つでもあるかどうか
        bool hasEven = numbers.Any(n => n % 2 == 0);

        Console.WriteLine(hasEven
            ? "偶数が少なくとも1つあります。"
            : "偶数は1つもありません。");
    }
}
C#

例3:ユーザー一覧から「未成年がいるか」を調べる

using System;
using System.Linq;
using System.Collections.Generic;

class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        var users = new List<User>
        {
            new User { Name = "山田太郎", Age = 25 },
            new User { Name = "佐藤花子", Age = 17 },
            new User { Name = "鈴木一郎", Age = 30 }
        };

        bool hasMinor = users.Any(u => u.Age < 20);

        Console.WriteLine(hasMinor
            ? "未成年のユーザーが含まれています。"
            : "未成年のユーザーはいません。");
    }
}
C#

コードのポイント

  • Any は「存在チェック」に使うメソッドです。
  • 実務では、バリデーションや条件分岐など、 さまざまな場面で頻繁に登場します。

検索・並び替えをまとめたミニテンプレート

最後に、今日学んだ5つをひとつにまとめた、 「LINQ 検索・並び替えテンプレート」を紹介します。

using System;
using System.Linq;
using System.Collections.Generic;

class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        var users = new List<User>
        {
            new User { Name = "山田太郎", Age = 25 },
            new User { Name = "佐藤花子", Age = 17 },
            new User { Name = "鈴木一郎", Age = 30 }
        };

        // 1. 年齢の昇順に並び替え
        var orderedAsc = users.OrderBy(u => u.Age);

        // 2. 年齢の降順に並び替え
        var orderedDesc = users.OrderByDescending(u => u.Age);

        // 3. 最初の大人(20歳以上)を取得(なければ例外)
        var firstAdult = users.First(u => u.Age >= 20);

        // 4. 最初の未成年(20歳未満)を取得(なければ null)
        var firstMinor = users.FirstOrDefault(u => u.Age < 20);

        // 5. 未成年が1人でもいるかどうか
        bool hasMinor = users.Any(u => u.Age < 20);

        Console.WriteLine("年齢の昇順:");
        foreach (var u in orderedAsc)
        {
            Console.WriteLine($"{u.Name} ({u.Age}歳)");
        }

        Console.WriteLine();

        Console.WriteLine("年齢の降順:");
        foreach (var u in orderedDesc)
        {
            Console.WriteLine($"{u.Name} ({u.Age}歳)");
        }

        Console.WriteLine();

        Console.WriteLine($"最初の大人: {firstAdult.Name} ({firstAdult.Age}歳)");

        if (firstMinor != null)
        {
            Console.WriteLine($"最初の未成年: {firstMinor.Name} ({firstMinor.Age}歳)");
        }
        else
        {
            Console.WriteLine("未成年のユーザーは見つかりませんでした。");
        }

        Console.WriteLine(hasMinor
            ? "未成年のユーザーが含まれています。"
            : "未成年のユーザーはいません。");
    }
}
C#

このテンプレートをベースに、

  • 並び替えの基準を変えてみる
  • First / FirstOrDefault の条件を変えてみる
  • Any の条件を変えてみる

といった小さな工夫を重ねていくと、 LINQ の検索・並び替えが、自然に手に馴染んでいきます。

Day 57 のまとめ

Day 57 では、

  • OrderBy が「昇順に並び替える」メソッドであること
  • OrderByDescending が「降順に並び替える」メソッドであること
  • First が「先頭の1件を取り出す」メソッドであり、 該当する要素がないと例外になること
  • FirstOrDefault が「見つからなければ既定値(値型なら 0、参照型なら null)を返す」メソッドであること
  • Any が「条件に合うものが1つでもあるかどうか」を調べるメソッドであること

を、具体的なコード例とともに学びました。

LINQ の検索・並び替えを使いこなせるようになると、

  • データの一覧から「欲しいものだけ」をスマートに取り出せる
  • 並び替えや存在チェックを、短く読みやすいコードで書ける
  • 実務でよくある「一覧画面」「検索機能」の裏側が、ぐっと身近に感じられる

そんな感覚が少しずつ育っていきます。

ぜひ、

  • 自分で配列やリストを用意して、並び替えや検索をいろいろ試してみる
  • オブジェクトの一覧に対して、今日の5つを組み合わせてみる

といった小さな一歩を重ねながら、 LINQ の“検索・並び替えの心地よさ”を、自分のコードで味わっていっていただければうれしいです。

タイトルとURLをコピーしました