【C#】ラムダ式とは
ラムダ式とは

C#言語のラムダ式(lambda expressions)とは、デリゲート(delegate)や、メソッド・ベースのLINQ文の(例えば)WhereメソッドやSelectメソッドなどの引数をシンプルに記述するために、C# 3.0(=Visual C# 2008)以降で導入された言語仕様である。

https://www.atmarkit.co.jp/fdotnet/rapidmaster/rapidmaster_01/rapidmaster_01.html

簡単に言うと、デリゲートやLINQの省略表記です。

メソッドの引数にメソッドを渡した際に、そのメソッドの戻り値のみを置き換える方式。
メソッドを簡略化して記述します。

例)

var result = list.Select( n => 0 < n );

上記の「=>」の部分、もしくは記述方法が「ラムダ式」になります。

ラムダ式
引数 => 戻り値
引数 => { 処理; 処理; 処理; return 戻り値; }

LINQ(配列やリストから値を抽出、加工する技術)を使ってラムダ式で値を抽出してみましょう。
と、その前に、for文を使って値を抽出する方法と比べてみましょう。

string s = "123,456,789";

int count = 0; //カンマの数
for (int i = 0; i < s.Length; i++) {
    //1文字ずつチェック
    if (s[i] == ',') {
       count++;
     }
}

上記のように、s変数から1文字ずつループ処理で抽出し、チェックしたとします。
これをLINQを使うと、1行で書けてしまいます。

tring s = "123,456,789";

// Countを使ったLINQ
int count = s.Count(x => x == ',');

// Whereを使ったLINQ
int count = s.Where(x => x == ',').Count();

上記の結果はどちらも同じになります。

もう1つサンプルを見てみましょう。

例)

public static void Main(string[] args)
{
  var list = new List(); // このListの各要素に".txt"をつける
  var result = list.Select(Append); // 関数を引数にしている
}
private static string Append(string s)
{
  return s + ".txt";
}

⇒これを以下のように戻り値に置き換えます。

public static void Main(string[] args)
{
   var list = new List(); // このListの各要素に".txt"をつける
   var result = list.Select((string s) => {return s + ".txt";} );
}

⇒Appdedメソッドの中身を展開した、この書き方がラムダ式。

さらに、上記から()や{}を省略して書くと、最初の例文と同じ形になります。

public static void Main(string[] args)
{
   var list = new List(); // このListの各要素に".txt"をつける
   var result = list.Select(s => s + ".txt");
}


メソッドを受け取る側の引数の書き方

普通は、メソッドの引数は型+変数名ですが、
メソッドの引数に、メソッドを受けとる場合は、メソッドを表す型を使用します(FuncとAction)

戻り値がある場合(voidじゃない) → Func
戻り値がない場合(void) → Action

例)

public IEnumerable<string> Read(string path, Func<string, string> fx)
{
}


デリゲート

関数を変数のように扱うためのもの。
関数の引数に関数を渡す。

使用例)
イベントハンドラ⇒イベントが起こったときに呼び出される処理は、デリゲートの仕組みが使われている

コールバック⇒ある関数が実行している途中で別の関数を実行させる仕組み。

※デリゲートについては、別の回で詳しくやる予定です

今日はここまで。