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

C#のラムダ式とは?
C#のラムダ式(lambda expressions)とは、ラムダ宣言演算子「=>」を使用する簡単な関数の書き方のことです。C# 3.0(=Visual C# 2008)以降で導入された言語仕様のため、一般的な記法ではあるものの、ベテランエンジニアの方でも馴染みのない方がいらっしゃるかもしれません。
本記事ではラムダ式の使い方を具体的なコードと合わせて紹介します。この機会に是非マスターしましょう。
ラムダ式を使うメリット
C#でラムダ式を使うと、その場でサクッと関数を書けます。「ラムダ式を使うと処理を渡すことができる」や「ラムダ式を他のメソッドに渡す」の章で詳しく説明します。
また、普通の関数の書き方に比べて簡略化できるため、タイピング量が少なく済みます。「C#のラムダ式で記述を省略できるもの3つ」の章で詳しく説明します。
ラムダ式を使うデメリット
後述しますが、ラムダ式の記述はいくつか省略できるパターンがあります。コード量を少なくできる恩恵がある反面、ラムダ式に慣れない方は可読性が悪いと感じてしまいます。
また、人によって簡略する方法が変わってしまう為、コーディング規約でルールを設けるといった記法統一の工夫が必要になります。
実例でわかるC#のラムダ式でできること9つ
C#のラムダ式についてネットで調べると、まずデリゲートや匿名メソッド(匿名関数)から説明しているサイトが多いのですが、知りたいことがすぐわからないと感じる人が多いのではないでしょうか。この記事ではそれらには触れず、ラムダ式でできることから説明しましょう。
まず、以下のようなループ処理があるとします。ソースの先頭には「using System.Collections.Generic;」を追加してください。
1
2
3
4
5
6
|
List<int> l = new List<int>() { 1, 2, 3, 4, 5 };<br>
for (int i = 0; i < l.Count; i++)<br>
{<br>
Console.WriteLine(l[i]);<br>
}<br>
|
1:ラムダ式を使うと処理を渡すことができる
C#のラムダ式を使うと、上の記述を以下のようにコンパクトにできます。
1
2
|
List<int> l = new List<int>() { 1, 2, 3, 4, 5 };<br>
l.ForEach(v => Console.WriteLine(v));<br>
|
ForEachは渡された処理をListの中の要素全てに対して行います。ForEachの()の中にあるのがラムダ式です。このようにラムダ式を使うとメソッドに行って欲しい処理を渡すことができます。
ラムダ式では以下のようなこともできます。ConvertAllは第1パラメータの配列の要素全てに第2パラメータの処理を行います。
1
2
3
4
5
6
7
|
int[] ary1 = { 1, 2, 3, 4, 5 };<br>
int[] ary2 = Array.ConvertAll(ary1, val => val + 1);<br>
foreach (int v in ary2)<br>
{<br>
Console.Write(v + "" "");<br>
}
|
実行結果は以下になります。ラムダ式のval => val + 1によりary1の値が全て1加算されています。
1
|
2 3 4 5 6
|
2:ラムダ式で文字列を一律で変更
C#のラムダ式は以下のようなこともできます。なおこれを実行する場合はソースの先頭に
using System.Collections.Generic;
using System.Linq;
を追加してください。
1
2
3
4
5
6
7
8
9
10
11
|
List<string> l = new List<string>();<br>
l.Add(""りんご"");<br>
l.Add(""バナナ"");<br>
var result = l.Select(str => str + ""は美味しい。"");<br>
string[] ary = result.ToArray();<br>
for (int i = 0; i < ary.Length; i++)<br>
{<br>
Console.WriteLine(ary[i]);<br>
}<br>
|
このC#サンプルを実行すると以下のように表示されます。ListクラスのSelectに指定したラムダ式で文字列が追加されています。なおこのSelectはC#のLINQという機能です。
1
2
|
りんごは美味しい。<br>
バナナは美味しい。<br>
|
3:ラムダ式を他のメソッドに渡す
C#のラムダ式を別のメソッドに渡すこともできます。以下のC#サンプルをご覧ください。なおソースの先頭には「using System.Collections.Generic;」の追加が必要です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public static List AddStr(List<string> list, Func<string,string> fc)<br>
{<br>
List<string> ret = new List<string>();<br>
foreach(string s in list)<br>
{<br>
ret.Add(fc(s));<br>
}<br>
return ret;<br>
}<br>
public static void Main()<br>
{<br>
List<string> ls = new List<string>();<br>
ls.Add(""おにぎり"");<br>
ls.Add(""サンドイッチ"");<br>
List<string> rt = AddStr(ls, str => str + ""は美味しい。"");<br>
foreach (string s in rt)<br>
{<br>
Console.WriteLine(s);<br>
}<br>
}<br>
|
4:ラムダ式の受け渡しで出来る事が広がる
上のC#サンプルでは、まずMainで文字列が入っているListを作って、AddStrメソッドにListとラムダ式を渡します。AddStrではパラメータの
1
|
Func<string, string> fc
|
でラムダ式を受け取ります。このFunc<,>の1つ目のstringはパラメータで、もう1つのstringは戻り値を表します。
AddStrでは返すためのListを作って、fc(s)で受け取ったListの中身をsに入れてラムダ式に渡します。そしてラムダ式の処理を行ったListを返しています。Main側ではその中身を表示します。このC#サンプルを実行すると以下のように表示されます。
1
2
|
おにぎりは美味しい。<br>
サンドイッチは美味しい。<br>
|
5:FuncとAction
Funcとは別にActionもあります。以下がサンプルです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public static void ActList(List<string> list, Action<string> ac)<br>
{<br>
foreach(string s in list)<br>
{<br>
ac(s);<br>
}<br>
}<br>
public static void Main()<br>
{<br>
List<string> ls = new List<string>();<br>
ls.Add(""おにぎり"");<br>
ls.Add(""サンドイッチ"");<br>
ActList(ls, str => Console.WriteLine(str));<br>
}<br>
|
6:Actionは戻り値を持てない
上のC#サンプルはActListメソッドにListと文字列を表示するラムダ式を渡して、それをActionで受け取って実行しています。結果は、以下のように表示されます。
1
2
|
おにぎり<br>
サンドイッチ<br>
|
7:ラムダ式のローカル関数は便利
C#にはローカル関数という機能があります。以下をご覧ください。
1
2
3
4
5
6
|
public static void Main()<br>
{<br>
Console.WriteLine(add_val(3, 4));<br>
int add_val(int a, int b) => a + b;<br>
}<br>
|
これを実行すると、7が表示されます。メソッドの中でちょっと使いたいメソッドをラムダ式で定義できるということです。このサンプルのように、使う場所の後であろうと、どこに記述しても良いです。
なおラムダ式で引数無しにする場合は以下のように()にします。
1
2
3
4
5
6
|
public static void Main()<br>
{<br>
disp_test();<br>
void disp_test() => Console.WriteLine(""Test!"");<br>
}<br>
|
8:LINQのWhereの使い方
最初の方でLINQのSelectを使いましたが、他のLINQの機能も紹介しましょう。以下をご覧ください。ソースの先頭には「using System.Linq;」の追加が必要です。
1
2
3
4
5
6
7
8
|
int[] ary1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };<br>
var waru3 = ary1.Where(v => v % 3 == 0);<br>
int[] ary2 = waru3.ToArray();<br>
foreach (int l in ary2)<br>
{<br>
Console.Write(l+"" "");<br>
}<br>
|
実行すると、以下が表示されます。
1
|
3 6 9<br>
|
9:OrderByでソートができる
最初の方で出てきたSelectは処理を実行するというLINQの機能です。そのサンプルでは文字列を追加するという処理を行っています。今回のWhereは条件の絞り込みを行います。このサンプルでは % 3 = 0 という条件で、3で割り切れる数をピックアップしています。
LINQには他にOrderByと言うメソッドもあります。
1
2
3
4
5
6
7
8
|
int[] ary1 = { 8, 3, 1, 5, 9, 4, 2, 6, 7 };<br>
var order = ary1.OrderBy(a => a);<br>
int[] ary2 = order.ToArray();<br>
foreach (int l in ary2)<br>
{<br>
Console.Write(l + "" "");<br>
}<br>
|
これを実行すると、
1
|
1 2 3 4 5 6 7 8 9<br>
|
となります。OrderByは昇順にソートします。なおOrderByDescendingを使うと降順になります。
C#のラムダ式で記述を省略できるもの3つ
C#のラムダ式でできることは理解していただけたでしょうか。
最後にラムダ式には省略記法を紹介します。すでに紹介したサンプルコードにも省略記法が使われていて、少し混乱した方もいるでしょうから、順番に見ていきましょう。
1:コードが1行の場合の{}
1行の処理しかないラムダ式では「{}」が省略できます。
「ラムダ式を使うと処理を渡すことができる」のコードを省略なしとありで見てみましょう。
1
2
3
4
5
6
7
8
9
|
List<int> l = new List<int>() { 1, 2, 3, 4, 5 };<br>
// ★省略なし<br>
l.ForEach(v => {<br>
Console.WriteLine(v)<br>
});<br>
// ★省略あり<br>
l.ForEach(v => Console.WriteLine(v));<br>
|
2:戻り値がありコードが1行の場合のreturn文
処理が1行しかなく、戻り値がある場合は「return」を省略する必要があります。
「ラムダ式を他のメソッドに渡す」のコードを省略なしとありで見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public static List AddStr(List<string> list, Func<string,string> fc)<br>
{<br>
List<string> ret = new List<string>();<br>
// (中略)<br>
return ret;<br>
}<br>
public static void Main()<br>
{<br>
List<string> ls = new List<string>();<br>
ls.Add(""おにぎり"");<br>
ls.Add(""サンドイッチ"");<br>
// ★省略なし<br>
List<string> rt = AddStr(ls, str => {<br>
return str + ""は美味しい。""<br>
});<br>
// ★省略あり<br>
List<string> rt = AddStr(ls, str => str + ""は美味しい。"");<br>
// (中略)<br>
}<br>
|
3:暗黙的な型パラメータが1つの場合の( )
ラムダ式のパラメータが1つで、且つそのパラメータが型推論できる場合、型を省略できます。
「ラムダ式を使うと処理を渡すことができる」のコードを例に説明すると、Console.WriteLineのパラメータはstring型である為、ラムダ式のパラメータの型を書かなくてもstringであると型推論してくれます。
1
2
3
4
5
6
7
|
List<int> l = new List<int>() { 1, 2, 3, 4, 5 };<br>
// ★省略なし<br>
l.ForEach((string v) => Console.WriteLine(v));<br>
// ★省略あり<br>
l.ForEach(v => Console.WriteLine(v));<br>
|
ラムダ式は積極的に使って慣れよう
C#のラムダ式の使い方について解説しましたが、ご理解いただけましたでしょうか。ラムダ式の説明で良く出てくるデリゲートや匿名メソッドを避けて、使い方の説明のみに特化しました。ただしそれらを知っておいた方がより理解が深まるので、調べてみてください。
ネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
オンライン面接も随時受付中。ぜひお気軽にご応募ください。

