ラムダ式とは
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)
{
}
デリゲート
関数を変数のように扱うためのもの。
関数の引数に関数を渡す。
使用例)
イベントハンドラ⇒イベントが起こったときに呼び出される処理は、デリゲートの仕組みが使われている
コールバック⇒ある関数が実行している途中で別の関数を実行させる仕組み。
※デリゲートについては、別の回で詳しくやる予定です
今日はここまで。