C#のラムダ式は難しくない!実例でわかるC#のラムダ式でできること9つを紹介

C#のラムダ式は難しくない!実例でわかるC#のラムダ式でできること9つを紹介のアイキャッチイメージ

C#のラムダ式とは?


C#のラムダ式(lambda expressions)とは、ラムダ宣言演算子「=>」を使用する簡単な関数の書き方のことです。C# 3.0(=Visual C# 2008)以降で導入された言語仕様のため、一般的な記法ではあるものの、ベテランエンジニアの方でも馴染みのない方がいらっしゃるかもしれません。

本記事ではラムダ式の使い方を具体的なコードと合わせて紹介します。この機会に是非マスターしましょう。

ラムダ式を使うメリット

C#でラムダ式を使うと、その場でサクッと関数を書けます。「ラムダ式を使うと処理を渡すことができる」や「ラムダ式を他のメソッドに渡す」の章で詳しく説明します。

また、普通の関数の書き方に比べて簡略化できるため、タイピング量が少なく済みます。「C#のラムダ式で記述を省略できるもの3つ」の章で詳しく説明します。

ラムダ式を使うデメリット

後述しますが、ラムダ式の記述はいくつか省略できるパターンがあります。コード量を少なくできる恩恵がある反面、ラムダ式に慣れない方は可読性が悪いと感じてしまいます。

また、人によって簡略する方法が変わってしまう為、コーディング規約でルールを設けるといった記法統一の工夫が必要になります。

実例でわかるC#のラムダ式でできること9つ


C#のラムダ式についてネットで調べると、まずデリゲートや匿名メソッド(匿名関数)から説明しているサイトが多いのですが、知りたいことがすぐわからないと感じる人が多いのではないでしょうか。この記事ではそれらには触れず、ラムダ式でできることから説明しましょう。

まず、以下のようなループ処理があるとします。ソースの先頭には「using System.Collections.Generic;」を追加してください。

1:ラムダ式を使うと処理を渡すことができる

C#のラムダ式を使うと、上の記述を以下のようにコンパクトにできます。

ForEachは渡された処理をListの中の要素全てに対して行います。ForEachの()の中にあるのがラムダ式です。このようにラムダ式を使うとメソッドに行って欲しい処理を渡すことができます。

ラムダ式では以下のようなこともできます。ConvertAllは第1パラメータの配列の要素全てに第2パラメータの処理を行います。

実行結果は以下になります。ラムダ式のval => val + 1によりary1の値が全て1加算されています。

2:ラムダ式で文字列を一律で変更

C#のラムダ式は以下のようなこともできます。なおこれを実行する場合はソースの先頭に
using System.Collections.Generic;
using System.Linq;
を追加してください。

このC#サンプルを実行すると以下のように表示されます。ListクラスのSelectに指定したラムダ式で文字列が追加されています。なおこのSelectはC#のLINQという機能です。

3:ラムダ式を他のメソッドに渡す

C#のラムダ式を別のメソッドに渡すこともできます。以下のC#サンプルをご覧ください。なおソースの先頭には「using System.Collections.Generic;」の追加が必要です。

4:ラムダ式の受け渡しで出来る事が広がる

上のC#サンプルでは、まずMainで文字列が入っているListを作って、AddStrメソッドにListとラムダ式を渡します。AddStrではパラメータの

でラムダ式を受け取ります。このFunc<,>の1つ目のstringはパラメータで、もう1つのstringは戻り値を表します。

AddStrでは返すためのListを作って、fc(s)で受け取ったListの中身をsに入れてラムダ式に渡します。そしてラムダ式の処理を行ったListを返しています。Main側ではその中身を表示します。このC#サンプルを実行すると以下のように表示されます。

5:FuncとAction

Funcとは別にActionもあります。以下がサンプルです。

6:Actionは戻り値を持てない

上のC#サンプルはActListメソッドにListと文字列を表示するラムダ式を渡して、それをActionで受け取って実行しています。結果は、以下のように表示されます。

7:ラムダ式のローカル関数は便利

C#にはローカル関数という機能があります。以下をご覧ください。

これを実行すると、7が表示されます。メソッドの中でちょっと使いたいメソッドをラムダ式で定義できるということです。このサンプルのように、使う場所の後であろうと、どこに記述しても良いです。

なおラムダ式で引数無しにする場合は以下のように()にします。

8:LINQのWhereの使い方

最初の方でLINQのSelectを使いましたが、他のLINQの機能も紹介しましょう。以下をご覧ください。ソースの先頭には「using System.Linq;」の追加が必要です。

実行すると、以下が表示されます。

9:OrderByでソートができる

最初の方で出てきたSelectは処理を実行するというLINQの機能です。そのサンプルでは文字列を追加するという処理を行っています。今回のWhereは条件の絞り込みを行います。このサンプルでは % 3 = 0 という条件で、3で割り切れる数をピックアップしています。

LINQには他にOrderByと言うメソッドもあります。

これを実行すると、

となります。OrderByは昇順にソートします。なおOrderByDescendingを使うと降順になります。

C#のラムダ式で記述を省略できるもの3つ


C#のラムダ式でできることは理解していただけたでしょうか。

最後にラムダ式には省略記法を紹介します。すでに紹介したサンプルコードにも省略記法が使われていて、少し混乱した方もいるでしょうから、順番に見ていきましょう。

1:コードが1行の場合の{}

1行の処理しかないラムダ式では「{}」が省略できます。
「ラムダ式を使うと処理を渡すことができる」のコードを省略なしとありで見てみましょう。

2:戻り値がありコードが1行の場合のreturn文

処理が1行しかなく、戻り値がある場合は「return」を省略する必要があります。
「ラムダ式を他のメソッドに渡す」のコードを省略なしとありで見てみましょう。

3:暗黙的な型パラメータが1つの場合の( )

ラムダ式のパラメータが1つで、且つそのパラメータが型推論できる場合、型を省略できます。
「ラムダ式を使うと処理を渡すことができる」のコードを例に説明すると、Console.WriteLineのパラメータはstring型である為、ラムダ式のパラメータの型を書かなくてもstringであると型推論してくれます。

ラムダ式は積極的に使って慣れよう


C#のラムダ式の使い方について解説しましたが、ご理解いただけましたでしょうか。ラムダ式の説明で良く出てくるデリゲートや匿名メソッドを避けて、使い方の説明のみに特化しました。ただしそれらを知っておいた方がより理解が深まるので、調べてみてください。

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。