質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

1942閲覧

ラムダ式っていうのが分かりません

chintao1224

総合スコア155

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

2クリップ

投稿2018/09/30 15:30

c#は古いバージョンしか分からないです。2005とか。
というより、いまc#を勉強しています。

ラムダ式というのが分かりません。
いろいろサイトを見ていたんですが、書いていることが難しくて。

ラムダ式って参照というものではないのでしょうか?

初心者にもわかりやすく教えてもらえないでしょうか?

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/11/05 21:13

初心者にもわかりやすく教えました。あなたにわかりやすいかどうかまでは、何も返事がないのでわかりません。
Zuishin

2018/12/08 07:42

初心者にもわかりやすく教えました。あなたにわかりやすいかどうかまでは、何も返事がないのでわかりません。
Zuishin

2018/12/08 07:42

初心者にもわかりやすく教えました。あなたにわかりやすいかどうかまでは、何も返事がないのでわかりません。
guest

回答3

0

ベストアンサー

次のコードを見てください。
(1)~(5)はすべて同じことをします。

C#

1using System; 2 3namespace ConsoleApp1 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 // (1) 10 Console.WriteLine(Add(2, 3)); 11 12 // (2) 13 Func<int, int, int> add = Add; 14 Console.WriteLine(add(2, 3)); 15 16 // (3) 17 add = (int a, int b) => { return a + b; }; 18 Console.WriteLine(add(2, 3)); 19 20 // (4) 21 add = (a, b) => { return a + b; }; 22 Console.WriteLine(add(2, 3)); 23 24 // (5) 25 add = (a, b) => a + b; 26 Console.WriteLine(add(2, 3)); 27 28 Console.ReadKey(); 29 } 30 31 static int Add(int a, int b) 32 { 33 return a + b; 34 } 35 } 36}

(1)
この後に定義された static int Add(int a, int b) メソッドを呼び出し、その戻り値をコンソールに出力しています。

(2)
Func<int, int, int> はデリゲート型と呼ばれる型の一つで、デリゲート型はメソッドを代入することができます。
Func<int, int, int> add = Add; と書くことで、デリゲート型の変数 add にメソッド Add を代入しています。
代入されたのは、メソッドを呼び出して得られた戻り値ではなく、メソッドそのものです。
ですので、この後 add(2, 3) と書いて Add(2, 3) を呼び出すことができます。

(3)
デリゲート型の add を再利用していますが、今度はメソッドではなくラムダ式を代入しています。
ラムダ式はデリゲート型に代入することでメソッドとしてコンパイルされ、呼び出すことができるようになります。
static int Add(int a, int b) とこのラムダ式を比較してください。
戻り値の型とメソッド名が省略され、引数と中身が ラムダ演算子(=>) で結ばれていますが、表記はメソッドそのものです。

C#

1// ラムダ式 2Func<int, int, int> add = (int a, int b) => { return a + b; };

C#

1// メソッド 2int Add(int a, int b) { return a + b; }

(4)
add は Func<int, int, int> 型の変数なので、ここで引数の型が宣言されています。
なので、引数の型を省略することができます。
(3) のラムダ式から引数の型を省略したのがこれです。
また、引数が一つの場合は () も省略できます。

C#

1// 引数が一つの場合 2Func<int, int> Increment = a => { return a + 1; }

(5)
処理内容が一つの式に収まる場合は、{} と ; と return を省略することができます。
(4) のラムダ式から省略したのがこれです。

#まとめ

  • デリゲートはメソッドを代入できる型である
  • ラムダ式はデリゲートにキャストすることでメソッドになる
  • デリゲートにキャストされるラムダ式は簡単に書けるよう多くの省略が許可されている

#余談:デリゲートでないラムダ式
ラムダ式が使われるのはデリゲートだけではありません。
例えば LINQ to SQL ではラムダ式をメソッドではなく SQL(つまり文字列)にコンパイルします。
ラムダ式は本来は式木と呼ばれるデータ構造を表現するためのものでアルゴリズムをデータとして表現するもので(C# の場合です。数学のラムダ式とは違います)、デリゲートや LINQ とは別の概念として理解してください。
LINQ で多用されるのがデリゲートで、デリゲートを簡単に記述するのがラムダ式です。

投稿2018/10/01 00:52

編集2018/10/01 22:56
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2018/10/01 18:35

式木にできないラムダ式があるので > ラムダ式は本来は式木と呼ばれるデータ構造を表現するためのもの はどうなんでしょうか
Zuishin

2018/10/01 21:14

確かに「本来」は言い過ぎでしたね。修正します。
guest

0

こんにちは。

ラムダ式というもののを一言で表すのは、知識レベルにもよるため難しいですが、C#の文法としてのラムダ式を簡単に説明するなら、

  • 変数に入れたり引数に渡したりできる「メソッド」を表現したもの

というのが理解しやすいかと思います。

ラムダ式はメソッドそのものであると考えてよく、=>の左側がメソッドの引数、右側がメソッドの内部処理に相当するものです。
ラムダ式の用途は「手続きそのものをメソッドの引数に渡したい」という場面で役立ちます。
例えば、Linqに関連してよくラムダ式の解説が登場しますが、Linqの各メソッドは「どのような処理をするのかは決まっていない」ので、その実処理をラムダ式として書いて引数に渡しているのです。

その他の細かいアレコレについては、上記をしっかり理解してからで良いでしょう。この内容が理解できなければ、その他の内容は高度すぎます。

投稿2018/09/30 17:07

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

基本的には匿名メソッドを作るときの構文を簡略化したものです。

名前のないメソッドを作成し、それを渡します。

投稿2018/09/30 17:25

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問