- 追加された行はこの色です。
- 削除された行はこの色です。
[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]
* 目次 [#v9445796]
#contents
*概要 [#g9d0b931]
ラムダ式っておじさん達には一瞬なんだかよく解りませんが、~
Java 8でもラムダ式がサポートされたようなので、私を含めて、~
そろそろラムダ式をちゃんと覚えようという人向けのコンテンツを書いてみました。
*ラムダ式 [#o8196989]
おじさん達の知識で振り返って分析してみると、~
中水準言語のC言語の関数ポインタから、
高水準言語の.NET言語(C#、VB)で、~
-デリゲート
-匿名関数
-ラムダ式
と進化してきていることぐらいは解る(?)と思います。
これを見ると、
-デリゲート~ラムダ式の歴史を辿って | もりひろゆきの日々是勉強~
http://moriblog.kit-eng.com/?p=975
厳密には、
-デリゲート(C# 1.0)~
同じシグネチャを持つメソッドを格納するための変数を宣言し、それを利用できる。
-デリゲート(C# 2.0)~
デリゲートの代入時にインスタンス生成(new デリゲート名)を省略できる。
-匿名メソッド・匿名関数(C# 2.0)~
delegate構文を用いて「メソッド名を持たない処理」を記述できる。
-定義済みデリゲート型(共通デリゲート型)(C# 3.0/.NET Framework 3.5)~
ジェネリックの機能を用いて、3種類のデリゲートが定義され、~
「delegateキーワードを使ったデリゲート宣言」を省略できる。
--戻り値のない定義済みデリゲートのAction~
最新の.NET 4.5では引数の数が最大16まであるデリゲートが定義されている。
--戻り値を持つ定義済みデリゲートのFunc~
最新の.NET 4.5では引数の数が最大16まであるデリゲートが定義されている。
--論理型のも戻り値を持つ定義済みデリゲートのPredicate
-ラムダ式(C# 3.0)~
--デリゲート型/式ツリー(ExpressionTree)を作成するために使用できる匿名関数
--ラムダ演算子(=>) を用いて左辺にパラメタ、右辺に式やコードブロックを置く
というふうに進化してきています。
ラムダ式は、[[LINQ]]クエリ式などの新しいAPIの~
使い勝手を良くするために生まれてきたようです。
-C#ラムダ式 基礎文法最速マスター - @IT~
http://www.atmarkit.co.jp/fdotnet/rapidmaster/rapidmaster_01/rapidmaster_01.html
>C#言語のラムダ式(lambda expressions)とは、~
デリゲート(delegate)や、メソッド・ベースの[[LINQ]]文の(例えば)~
WhereメソッドやSelectメソッドなどの引数をシンプルに記述するために、~
C# 3.0(=Visual C# 2008)以降で導入された言語仕様である。
これについては、以下の[[利用例>#mea2384e]]を引き合いに出して説明したいと思います。
*利用例 [#mea2384e]
ということで、引数をラムダ式にすることで、~
以下のような効果が期待できるようなシーンが、~
ラムダ式の代表的な利用ケースではないか?と思います。
-delegateを必要とするメソッドを実行しやすくする。
--[C#][ラムダ式][LINQ][式木] 匿名メソッドとラムダ式の違い~
(プログラミング C# - 翔ソフトウェア (Sho's))~
http://blog.shos.info/archives/2012/11/clinqexpression.html
>ラムダ式を使った方が、型推論の恩恵を存分に受けられ、書き方がぐっとシンプルになる。
-これは、[[LINQ]]のメソッド ベースのクエリ構文で使用されています。~
SELECTやWHEHE句などの動作のカスタマイズにdelegateを使用可能ですが、~
これを一般的にはラムダ式を使用して記述します。
var query5 = RowList
.Where(p => p.Field<int>("年度") == 2012)
.Select(p => new
{
年度 = p.Field<int>("年度"),
種別 = p.Field<int>("種別"),
生年度 = p.Field<int>("生年度"),
平均人員2 = p.Field<int>("平均人員") / 12,
支給年金額 = p.Field<int>("支給年金額")
});
-その他、任意の変数の編集結果を関数に渡すことができる。
--ASP.NET MVC で WebGrid を最大限に活用する - MSDN~
https://msdn.microsoft.com/ja-jp/magazine/hh288075.aspx
>新しい WebGrid<T> 実装では、format パラメーターに~
Func<T, object> を受け取る新しい Column メソッドを追加しています。~
grid.Column(
columnName: "EmailAddress",
header: "Email Address",
format: item => Html.EmailLink(
(string)item.EmailAddress,
(string)item.EmailAddress,
""
),
canSort: false
)
ということで、おじさん達でもラムダ式なんて簡単に理解できます。~
だから、ラムダ式使えるからって、あんまりおじさん達をイジメないように。~
#でも、おじさん達はラムダ式を使わないし、~
#ラムダ式って読み難いと思ってるけどね(笑)。
*ポイント [#kfb99b40]
**文法 [#a6c0a0d3]
***式形式 [#q3f16b1c]
-引数がない場合
() => {
(実装)
}
-引数が一つの場合
(引数名) => {
(実装)
}
-引数が複数の場合
(引数名1,引数名2,引数名3, ...) => {
(実装)
}
***ステートメント形式 [#tfa1d0b5]
-引数がない場合
() => (実装)
-引数が一つの場合
引数名 => (実装);
-引数が複数の場合
(引数名1,引数名2,引数名3, ...) => (実装)
**スコープ [#td9e44e5]
ラムダ式では、そのスコープの外側にある変数やメソッドを利用でき引数の肥大化が防げる。
*参考 [#h35da447]
-C#&VB ラムダ式 基礎文法★チートシート - @IT~
http://www.atmarkit.co.jp/fdotnet/chushin/cheatsheet_01/cheatsheet_01_01.html
--C#ラムダ式 基礎文法最速マスター - @IT~
http://www.atmarkit.co.jp/fdotnet/rapidmaster/rapidmaster_01/rapidmaster_01.html
--VBラムダ式 基礎文法最速マスター - @IT~
http://www.atmarkit.co.jp/fdotnet/rapidmaster/rapidmaster_02/rapidmaster_02.html
-[[LINQ]]
--Chapter16 LINQとメソッド構文 - @IT~
http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_16/extremecs_16_01.html
--Enumerable メソッド (System.Linq)~
https://msdn.microsoft.com/ja-jp/library/system.linq.enumerable_methods.aspx
-関数型プログラミングって何、ラムダってなんだよ - Qiita~
http://qiita.com/lrf141/items/98ffbeaee42d30cca4dc