1. ホーム
  2. c#

[解決済み】C#のラムダ式。なぜ私はそれらを使用する必要がありますか?

2022-03-27 19:09:45

質問

をさっと読みました。 Microsoft Lambda Expression のドキュメントを参照してください。

このような例で理解が深まりましたけど。

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

それにしても、なぜそんなに革新的なのか、理解できません。ただのメソッドで、メソッド変数が終了すると死んでしまうんでしょう?なぜ、本物のメソッドではなく、これを使わなければならないのでしょうか?

どのように解決するの?

ラムダ式 は匿名代議員のためのシンプルな構文で、匿名代議員が使用できる場所ならどこでも使用することができます。 しかし、その逆は真ではありません。ラムダ式は式木に変換することができ、LINQ to SQLのような多くのマジックを実現することができます。

以下は LINQ to Objects 匿名デリゲートとラムダ式を使って、より簡単に表現することができます。

// anonymous delegate
var evens = Enumerable
                .Range(1, 100)
                .Where(delegate(int x) { return (x % 2) == 0; })
                .ToList();

// lambda expression
var evens = Enumerable
                .Range(1, 100)
                .Where(x => (x % 2) == 0)
                .ToList();

ラムダ式と匿名デリゲートは、別の関数を書くよりも利点があります。 クロージャ を可能にすることができます。 パラメータを追加することなく、ローカルの状態を関数に渡します。 を関数に追加したり、一度だけ使用するオブジェクトを作成したりします。

表現ツリー はC# 3.0の非常に強力な新機能で、実行可能なメソッドへの参照を取得するだけでなく、式の構造をAPIで確認することができます。 APIはただデリゲートパラメータを Expression<T> コンパイラは無名デリゲートの代わりにラムダから式木を生成します。

void Example(Predicate<int> aDelegate);

のように呼ばれる。

Example(x => x > 5);

になります。

void Example(Expression<Predicate<int>> expressionTree);

後者には 抽象構文木 を記述した式 x > 5 . LINQ to SQLは、C#の式をサーバー側でフィルタリングや順序付けなどに必要なSQL式に変換できるようにするために、この動作に依存しているのです。