こんにちは、リバティエンジニア[?]のFUNAです。 現役エンジニアとしてアプリケーション開発やWeb制作、SEOやブログ運営をしています。
C#を勉強していると、ほとんどの方が詰まってしまう場所といえば、「ラムダ式」がかなり上位にランクインすると思います。
理由としては、ラムダ式だけ考え方が少し違っていて、頭の使い方が異なるんです。
なので、混乱してしまう方が多いように思いますし、実際に私もそのうちの1人でした。
今回はそんなラムダ式について、わかりやすく解説していこうと思います。
ラムダ式とは?
まずはそもそも、「ラムダ式」とは何なのかを見ていきましょう!
なので、まずはデリゲートについて軽く説明しますね。
C# delegate(デリゲート)とは?
delegate(デリゲート)を簡単に説明すると、関数を変数のように扱う為のものなんです。
もし、関数を変数のように扱えれば、関数の引数に関数を渡す事ができますよ。
関数の引数に関数を渡せる?
それってつまりなんのためですか?
もし、引数に関数が渡せれば、計算式の一部だけを簡単に差し替える事が可能になるので、より汎用性がでてきますよ。
このデリゲートについては、今回は深く説明しないので、知りたい方は紹介している記事があるので、是非参考にしてみてください!
C# 世界一わかるデリゲート(delegate)について
delegateのサンプルコード
// デリゲート宣言
public delegate bool TestDelegate(int n);
// クラス宣言
public class TestList : List<int>
{
public TestList Select(TestDelegate func)
{
var list = new TestList();
foreach (var obj in this)
{
if (func(obj))
{
list.Add(obj);
}
}
return list;
}
}
上記は、List<T>を継承したクラスで、条件に合う項目だけを抜き出すことができる、「Selectメソッド」を作りました。この「条件に合う」という部分にdelegateを使っています。
では早速このクラスを使ったサンプルを見ていきましょう。
// クラスのインスタンス
var list = new TestList();
list.Add(0);
list.Add(1);
list.Add(2);
var result = list.Select(
delegate (int n)
{
if (0 < n)
{
return true;
}
else
{
return false;
}
});
このように、匿名メソッドを記述して、値が0以上の項目を抜き出しています。
匿名メソッドについては、わかりやすくまとめている記事があるので参考にしてみてください。
C#2.0 で追加された「匿名メソッド」とは?
デリゲートや匿名メソッドについて理解で来たところで、ラムダ式についてみていきましょう!
ラムダ式とは匿名メソッドを簡単にしたもの
簡単に説明すると、ラムダ式とは「匿名メソッドを簡単にしたもの」なんです。
例えば、先ほどデリゲートを説明したコードでラムダ式を使い簡単に記述してみましょう。
var list = new TestList();
list.Add(0);
list.Add(1);
list.Add(2);
var result = list.Select(
delegate (int n)
{
return (0 < n);
});
このように記述されているものを、delegateが記述されている部分を[ => ]に置き換えたものがラムダ式と呼ばれるものです。
var result = list.Select(
(int n) =>
{
return (0 < n);
});
これだけでも結構省略されてきましたが、もっと省略する方法があります。
C#には型推論という機構があるのですが、この型推論機構を利用することでラムダ式は、引数の型の記述を省略する事ができます。
var result = list.Select(
(n) =>
{
return 0 < n;
});
さらに、関数の中身が1行の場合、{}もreturnも省略する事ができます。
// 関数の中身が1行なので{}とreturnを省略
var result = list.Select((n) => 0 < n);
また、もしdelegateの引数が1つだけの場合は()も省略する事ができます。
// delegateの引数が1つだけの場合は()も省略できる
var result = list.Select(n => 0 < n);
ラムダ式を使った記述[Before, After]
var list = new TestList();
list.Add(0);
list.Add(1);
list.Add(2);
var result = list.Select(
delegate (int n)
{
return (0 < n);
});
この記述がラムダ式を使って省略すると、、、
var result = list.Select(n => 0 < n);
たった1行になってしまうんです。
まとめ
今回は、C#で勉強していく中でほとんどの方が躓くほど、戸惑ってしまう「ラムダ式」についてみていきました。
このラムダ式を理解するには、delegate(デリゲート)や匿名メソッドについての基礎知識が必要になります。
それぞれの解説もしているのでよかったら参考にしてみてくださいね!
C# 世界一わかるデリゲート(delegate)について
C#2.0 で追加された「匿名メソッド」とは?