カテゴリ: C# 更新日: 2026/05/06

C#のラムダ式をメソッド引数に渡す方法をやさしく解説!高階関数の基本がわかる

C#のラムダ式をメソッド引数に渡す方法(高階関数)
C#のラムダ式をメソッド引数に渡す方法(高階関数)

先生と生徒の会話形式で理解しよう

生徒

「C#のラムダ式って、その場で使うものだと思っていたんですが、メソッドに渡すこともできるんですか?」

先生

「できますよ。ラムダ式は“処理そのもの”を値として扱えるので、メソッドの引数として渡せます。」

生徒

「処理を引数にするって、ちょっとイメージが難しいです……」

先生

「では、身近なたとえを使いながら、C#の高階関数の考え方を一緒に見ていきましょう。」

1. ラムダ式を引数に渡すとはどういうこと?

1. ラムダ式を引数に渡すとはどういうこと?
1. ラムダ式を引数に渡すとはどういうこと?

C#のラムダ式とは、「その場で定義できる簡単なメソッド」のようなものです。 これまでの解説では、ラムダ式を変数に代入したり、その場で実行したりしてきました。 しかしC#では、ラムダ式をメソッドの引数として渡すことができます。

引数とは、メソッドに渡す情報のことです。数字や文字列を渡すのと同じように、 「何をするか」という処理自体を渡せるのが、ラムダ式の大きな特徴です。 このような考え方を高階関数と呼びます。

高階関数とは、「関数(C#ではメソッドやラムダ式)を受け取ったり、返したりできる仕組み」のことです。 難しく聞こえますが、実際はとても便利で、C#のプログラミングではよく使われています。

2. 身近なたとえで考える高階関数

2. 身近なたとえで考える高階関数
2. 身近なたとえで考える高階関数

ここで、料理をたとえに考えてみましょう。 「野菜を調理する」というメソッドがあったとします。 その中で、「切る」「焼く」「ゆでる」などの調理方法を変えたい場合、 毎回別のメソッドを書くのは大変です。

そこで、「調理方法」を引数として渡せるようにします。 これが、ラムダ式をメソッド引数に渡すイメージです。 C#では、処理をデータのように扱えるため、こうした柔軟な設計が可能になります。

プログラミング未経験の方でも、「やり方を後から指定できる」と考えると理解しやすくなります。 C#のラムダ式とデリゲートは、まさにこの考え方を実現する仕組みです。

3. C#でラムダ式を引数に受け取る基本形

3. C#でラムダ式を引数に受け取る基本形
3. C#でラムダ式を引数に受け取る基本形

C#でラムダ式を引数に受け取るには、デリゲート型を使います。 初心者の方には、標準で用意されているActionFuncを使うのがおすすめです。

Actionは「処理はするが、結果を返さない」ラムダ式を受け取るための型です。 まずは一番シンプルな例を見てみましょう。


static void Execute(Action action)
{
    action();
}

このメソッドは、Action型の引数を1つ受け取り、その中身を実行しています。 ここで重要なのは、「何を実行するか」をメソッドの外から渡せる点です。

4. ラムダ式を実際に引数として渡してみよう

4. ラムダ式を実際に引数として渡してみよう
4. ラムダ式を実際に引数として渡してみよう

では、先ほどのメソッドにラムダ式を渡してみます。 ラムダ式はその場で書けるので、別にメソッドを定義する必要がありません。


Execute(() =>
{
    Console.WriteLine("ラムダ式が実行されました");
});

このコードでは、「画面に文字を表示する処理」をラムダ式として渡しています。 Executeメソッドは、その内容を知らなくても実行できます。 これが、高階関数の基本的な考え方です。


ラムダ式が実行されました

5. 引数を受け取るラムダ式を渡す場合

5. 引数を受け取るラムダ式を渡す場合
5. 引数を受け取るラムダ式を渡す場合

ラムダ式は、引数を受け取ることもできます。 その場合は、Action<型>を使います。 ここでは、数値を受け取って表示する例を見てみましょう。


static void ShowNumber(Action<int> action)
{
    action(10);
}

このメソッドは、整数を受け取るラムダ式を引数として受け取り、 そのラムダ式に10を渡して実行しています。


ShowNumber(number =>
{
    Console.WriteLine(number);
});

10

このように、メソッド側で値を用意し、処理の内容だけを外から指定できるのが特徴です。 C#のラムダ式をメソッド引数に渡すことで、プログラムの柔軟性が大きく向上します。

6. なぜラムダ式を引数に渡すのか

6. なぜラムダ式を引数に渡すのか
6. なぜラムダ式を引数に渡すのか

C#でラムダ式をメソッド引数に渡す理由は、「同じ流れで、処理だけを変えたい」場面が多いからです。 繰り返し処理や条件による動作の違いを、シンプルに書けるようになります。

初心者のうちは難しく感じるかもしれませんが、 「やり方を後から渡せる仕組み」と考えると理解しやすくなります。 ラムダ式と高階関数は、C#のモダンな書き方を支える重要な要素です。

この考え方に慣れてくると、C#の標準機能やライブラリの理解も一気に進みます。 まずは、簡単な例から少しずつ使ってみることが大切です。

まとめ

まとめ
まとめ

ラムダ式と高階関数の要点を整理

ここまでの内容を振り返ると、C#のラムダ式は単なる省略記法ではなく、「処理そのものを値として扱える」非常に強力な仕組みであることが分かります。 特に、メソッドの引数としてラムダ式を渡せる点は、C#の設計思想を理解するうえで重要なポイントです。 数値や文字列と同じように、処理を引数として扱えることで、プログラムの柔軟性と再利用性が大きく向上します。

この考え方は高階関数と呼ばれ、関数を引数として受け取る、または関数を返すといった特徴を持っています。 一見すると難しく感じるかもしれませんが、「処理の中身を後から決められる仕組み」と考えると理解しやすくなります。 実務においても、この仕組みは非常によく使われており、特にコレクション操作やイベント処理などで活躍します。

ActionとFuncを使った基本パターン

C#では、ラムダ式を扱うためにデリゲート型が必要になりますが、初心者の方はまずActionとFuncを覚えることが大切です。 Actionは戻り値がない処理を表し、Funcは戻り値がある処理を表します。 この二つを使い分けることで、多くの場面に対応できるようになります。


static void Process(Action action)
{
    Console.WriteLine("処理開始");
    action();
    Console.WriteLine("処理終了");
}

このように、処理の流れはメソッド側で固定し、具体的な処理内容だけを外から渡すことで、同じ構造を保ちながら多様な動作を実現できます。 これは保守性の高いコードを書くうえでも非常に重要なテクニックです。


Process(() =>
{
    Console.WriteLine("任意の処理を実行");
});

処理開始
任意の処理を実行
処理終了

引数付きラムダ式の活用

ラムダ式は引数を受け取ることもできるため、より実践的な処理を記述できます。 特にActionやFuncに型パラメータを指定することで、柔軟な設計が可能になります。


static void Calculate(Func<int, int, int> func)
{
    int result = func(5, 3);
    Console.WriteLine(result);
}

Calculate((a, b) =>
{
    return a + b;
});

8

このように、計算方法そのものを外から渡せるため、同じメソッドを使い回しながら異なるロジックを適用できます。 これはコードの重複を減らし、可読性を高めるうえで非常に有効です。

実務で役立つポイント

ラムダ式をメソッド引数として渡すテクニックは、実務においても頻繁に利用されます。 例えば、リストの検索や並び替え、イベント処理、非同期処理など、多くの場面で活用されています。 特にLINQと組み合わせることで、短く読みやすいコードを書くことができるようになります。

また、処理の共通部分と可変部分を分離することで、拡張しやすい設計を実現できます。 これは大規模なシステム開発において非常に重要な考え方であり、早い段階で理解しておくと後の学習がスムーズになります。

理解を深めるためのコツ

初心者のうちは、ラムダ式や高階関数の概念に戸惑うこともありますが、まずは簡単なサンプルコードを何度も試してみることが大切です。 小さな処理をラムダ式で書き、それをメソッドに渡すという流れに慣れていくことで、自然と理解が深まっていきます。

また、既存のコードを読む際にも、「どこで処理が渡されているのか」「どのタイミングで実行されるのか」を意識すると、理解が一段と進みます。 この視点を持つことで、より高度なプログラミングにも対応できるようになります。

先生と生徒の振り返り会話

生徒

「ラムダ式って、ただの短い書き方だと思っていましたが、処理そのものを渡せるのがポイントなんですね」

先生

「その通りです。C#では処理もデータの一つとして扱えるので、設計の自由度が高くなります」

生徒

「メソッドの中身を変えずに、動作だけ変えられるのが便利だと感じました」

先生

「それが高階関数の大きなメリットです。共通処理と個別処理を分けることで、コードがすっきりします」

生徒

「ActionとFuncの違いも少し分かってきました。戻り値があるかどうかで使い分けるんですね」

先生

「はい。その理解ができていれば、実務でも十分に活用できます。まずは簡単な例からどんどん試してみてください」

生徒

「これからはラムダ式を見ても怖くなさそうです。少しずつ使いこなせるように練習します」

先生

「その姿勢が大切です。理解を積み重ねていけば、自然と応用もできるようになりますよ」

カテゴリの一覧へ
新着記事
New1
C#
C#のメソッドのオーバーロードとは?同名メソッドを複数定義する方法
New2
C#
C#の出力と入力の基本をマスター!初心者でもわかるConsole.WriteLine()とConsole.ReadLine()の使い方
New3
C#
C# GUIアプリでファイルダイアログを使う方法!WinFormsとWPFの基本操作を完全解説
New4
Azure
Azure SQL Databaseの認証設定を徹底解説!Entra ID(旧Azure AD)統合でセキュアなデータベース管理を実現する方法
人気記事
No.1
Java&Spring記事人気No1
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.4
Java&Spring記事人気No4
C#
C# WinForms入門!初心者でも簡単にWindowsアプリを作る方法
No.5
Java&Spring記事人気No5
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.6
Java&Spring記事人気No6
Azure
Azure Bastionの使い方を徹底解説!踏み台サーバー不要で安全にRDP/SSH接続
No.7
Java&Spring記事人気No7
C#
C#のログ出力入門!SerilogとNLogの使い方を徹底解説
No.8
Java&Spring記事人気No8
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド