基礎から学ぶC#入門 90日コース | 実践的なC#プログラミング - Day 56:LINQ入門

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

Day 56 のゴールと全体像

Day 56 では、C# の世界をぐっと“気持ちよく”してくれる機能、LINQ(リンク)を扱います。 今日のテーマは次の3つです。

  • LINQとは
  • Where
  • Select

配列やリストを扱うとき、 「毎回 foreachif でゴリゴリ書いていて、ちょっとしんどいな…」と感じたことがある方も多いと思います。 LINQは、そんな場面をすっきりと、そして少し楽しくしてくれる存在です。

ここでは、初心者の方でも迷子にならないように、 ステップバイステップで丁寧に解説していきます。

LINQとは

コレクションに対する「問い合わせ」をコードで書く仕組み

LINQ は Language Integrated Query の略で、 「言語に統合された問い合わせ機能」という意味を持ちます。

ざっくり言うと、

配列やリストなどの“データの集まり”に対して、 SQL のような“問い合わせ”を、C# のコードで自然に書ける仕組み

だと思っていただくとイメージしやすいです。

従来の書き方と LINQ の違い

例えば「10より大きい数字だけ取り出したい」という処理を考えてみます。

従来の書き方(foreach)

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var numbers = new List<int> { 5, 12, 3, 18, 7 };

        var result = new List<int>();

        // 1つずつ取り出して条件をチェック
        foreach (var n in numbers)
        {
            if (n > 10)
            {
                result.Add(n); // 条件を満たしたものだけ追加
            }
        }

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

LINQ を使った書き方

using System;
using System.Collections.Generic;
using System.Linq; // LINQ を使うために必要

class Program
{
    static void Main()
    {
        var numbers = new List<int> { 5, 12, 3, 18, 7 };

        // 条件に合うものだけを抽出
        var result = numbers.Where(n => n > 10);

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

同じことをしているのに、 LINQ のほうが「何をしたいのか」がストレートに伝わってきます。

  • Where(n => n > 10) → 「n が 10 より大きいものだけ欲しい」

という“意図”が、そのままコードになっている感じですね。

Where で絞り込む

Where の役割

Where は LINQ の中でも、最もよく使われるメソッドのひとつです。 役割はとてもシンプルで、

条件に合う要素だけを取り出す

というフィルターのような働きをします。

基本形のテンプレート

コレクション.Where(x => 条件)
C#
  • コレクション:配列、リストなど
  • x:1つずつ取り出される要素
  • 条件x に対して true / false を返す式

例1:偶数だけ取り出す

using System;
using System.Linq; // LINQ を使うために必要

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

        // 偶数だけを抽出する
        var evenNumbers = numbers.Where(x => x % 2 == 0);

        Console.WriteLine("偶数の一覧:");

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

コードのポイント

  • x => x % 2 == 0 は「x を受け取って、x が偶数かどうかを返す関数」です。
  • Where は「その関数を使って、true になるものだけを残す」メソッドです。

例2:文字列の長さで絞り込む

using System;
using System.Linq;

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

        // 3文字以上の名前だけを抽出
        var longNames = names.Where(name => name.Length >= 3);

        Console.WriteLine("3文字以上の名前:");

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

コードのポイント

  • name => name.Length >= 3 という条件で、 「文字数が3以上かどうか」をチェックしています。
  • 数値だけでなく、文字列やオブジェクトにも自由に条件をかけられるのが LINQ の魅力です。

Select で変換する

Select の役割

Select は、データを“別の形に変換する”ためのメソッドです。

元の要素を受け取って、 「こういう形にしたい」という変換結果を返す

というイメージです。

基本形のテンプレート

コレクション.Select(x => 変換後の値)
C#
  • x:元の要素
  • 変換後の値:新しく作りたい値

例1:数字を2倍にして取り出す

using System;
using System.Linq;

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

        // 数字を2倍に変換
        var doubled = numbers.Select(x => x * 2);

        Console.WriteLine("2倍にした結果:");

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

コードのポイント

  • x => x * 2 は「x を受け取って、x * 2 を返す関数」です。
  • Select は「その関数を使って、すべての要素を変換する」メソッドです。

例2:文字列を「表示用のメッセージ」に変換する

using System;
using System.Linq;

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

        // 名前を「こんにちは、○○さん」というメッセージに変換
        var messages = names.Select(name => $"こんにちは、{name}さん");

        foreach (var msg in messages)
        {
            Console.WriteLine(msg);
        }
    }
}
C#

コードのポイント

  • name => $"こんにちは、{name}さん" というラムダ式で、 「名前」から「挨拶メッセージ」を作っています。
  • Select は「元のデータを、別の意味を持つデータに変換する」場面でとても便利です。

Where と Select を組み合わせる

LINQ の真価は「つなげて使う」ことにある

LINQ は、メソッドをつなげて使うことで、 複雑な処理を驚くほど読みやすくできます。

例:10より大きい数字を2倍にして取り出す

using System;
using System.Linq;

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

        var result = numbers
            .Where(n => n > 10)   // 10より大きいものだけ
            .Select(n => n * 2);  // それを2倍にする

        Console.WriteLine("10より大きい数字を2倍にした結果:");

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

コードの読み方

  • Where(n => n > 10) → 「まず、10より大きいものだけを残す」
  • Select(n => n * 2) → 「残ったものを2倍にする」

このように、

絞り込み → 変換

という流れが、コードの形そのままに表現されています。 “処理のストーリー”がそのままコードになっている感じで、 読んでいて気持ちがいいですよね。

オブジェクトに対して LINQ を使う

クラスの一覧に対して Where / Select を使う

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 }
        };

        // 20歳以上のユーザーだけを抽出し、その名前だけを取り出す
        var adultNames = users
            .Where(u => u.Age >= 20)   // 年齢で絞り込み
            .Select(u => u.Name);      // 名前だけに変換

        Console.WriteLine("20歳以上のユーザーの名前:");

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

コードのポイント

  • Where(u => u.Age >= 20) で、「User の Age プロパティ」を条件にしています。
  • Select(u => u.Name) で、「User から Name だけを取り出す」変換をしています。
  • LINQ は「オブジェクトのプロパティを使った絞り込み・変換」にとても相性が良いです。

LINQ入門の基本テンプレート

最後に、初心者の方がまず覚えておくと便利な「LINQ入門テンプレート」をまとめておきます。

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

class Program
{
    static void Main()
    {
        var numbers = new List<int> { 1, 2, 3, 4, 5, 6 };

        // 1. Where:条件で絞り込む
        var evenNumbers = numbers.Where(x => x % 2 == 0); // 偶数だけ

        // 2. Select:変換する
        var doubledNumbers = numbers.Select(x => x * 2);  // 2倍にする

        // 3. 組み合わせ:3より大きい数字を2倍にして文字列にする
        var messages = numbers
            .Where(x => x > 3)
            .Select(x => $"値は {x * 2} です");

        Console.WriteLine("偶数:");
        foreach (var n in evenNumbers)
        {
            Console.WriteLine(n);
        }

        Console.WriteLine("2倍:");
        foreach (var n in doubledNumbers)
        {
            Console.WriteLine(n);
        }

        Console.WriteLine("メッセージ:");
        foreach (var msg in messages)
        {
            Console.WriteLine(msg);
        }
    }
}
C#

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

  • 条件を変えてみる
  • 変換内容を変えてみる
  • オブジェクトの一覧に対して使ってみる

といった小さな工夫を重ねていくと、 LINQ の感覚が少しずつ手に馴染んでいきます。

Day 56 のまとめ

Day 56 では、

  • LINQ が「コレクションに対する問い合わせを、読みやすく書くための仕組み」であること
  • Where が「条件で絞り込む」ためのメソッドであること
  • Select が「別の形に変換する」ためのメソッドであること
  • WhereSelect を組み合わせることで、 「絞り込み → 変換」という流れを、コードの形そのままに表現できること

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

LINQ を使い始めると、

  • コレクション操作が短く、読みやすくなる
  • 意図がコードにそのまま乗るようになる
  • データ処理が少し楽しく感じられる

そんな変化が、少しずつ実感できるはずです。

ぜひ、

  • 自分で配列やリストを用意して、条件や変換をいろいろ試してみる
  • オブジェクトの一覧に対して、WhereSelect を使ってみる

といった小さな一歩を重ねながら、 LINQ の心地よさを、自分の手で確かめていっていただければうれしいです。

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