ラムダ式

短い操作を別のメソッドに渡す場合にラムダ式を選択します。この操作は、それを使用する呼び出しの横で最も明確です。 インライン ルールでは、アイテムを選択または変換する方法が閲覧者に表示されます。名前付きメソッドを使用すると、操作の目的に従って詳細を調べることができます。

Tip

この記事では、C# のメソッドとコレクションを知っている開発者向けの実用的な選択肢について説明します。 ラムダ構文とルールの詳細については、 ラムダ式のリファレンスを参照してください。

ラムダ式は、別のコードで動作が必要な場合に記述する名前のない関数です。

次のラムダはセッションを受け入れ、セッションに開いているシートがあるかどうかを返します。

session => session.Registered < session.Capacity

=>演算子は、左側のパラメーターを右側の本体から分離します。 "行く" と読みます。

メソッドに動作を渡す

多くの.NET API はデリゲートを受け入れます。デリゲートは、特定のパラメーター リストと戻り値の型を持つ動作を表す型です。 ラムダは、その動作を提供します。 FuncやActionなどのデリゲート型の概要については、「ラムダ式、デリゲート、およびイベント」を参照してください。

次の例は、ワークショップ セッションで動作します。 WorkshopSessionには、タイトル、期間、容量、登録数が含まれます。

int maximumMinutes = 60;

var shortSessions = sessions
    .Where(session => session.DurationMinutes <= maximumMinutes)
    .OrderBy(session => session.Title);

foreach (WorkshopSession session in shortSessions)
{
    Console.WriteLine(session.Title);
}

最初のラムダは、保持するセッション Where に指示します。 2 つ目は、並べ替える値 OrderBy 示します。 メソッドは、どちらのルールの詳細も知らずに動作を受け取ります。

パラメーター フォームを選択する

明確な状態を保つ最短のパラメーター フォームを選択します。

session => session.DurationMinutes <= 60

1 つのパラメーターの場合、コンパイラが型を推論できる場合は、かっこを省略します。 パラメーターを指定しない場合は、空のかっこを使用します。

() => DateTime.Now

2 つ以上のパラメーターにはかっこを使用します。

(left, right) => left + right

通常、ラムダを受け取るメソッドは、コンパイラがパラメーター型を推論するのに十分な情報を提供します。 推論にヘルプが必要な場合、または型が明確になったときに、明示的な型を記述します。

(WorkshopSession session) => session.Title

ラムダ式のリファレンスでは、パラメーター修飾子、属性、既定値、およびその他の特殊な形式について説明します。

式またはステートメント本文を選択する

1 つの 式 で結果が計算される場合は、式ラムダを使用します。

session => session.Registered < session.Capacity

操作に複数のステートメントが必要な場合は、ステートメント ラムダ を使用します。 本文を中かっこで囲み、ラムダが値を返すときに return を含めます。

var descriptions = sessions.Select(session =>
{
    int seatsLeft = session.Capacity - session.Registered;
    string availability = seatsLeft > 0 ? $"{seatsLeft} seats left" : "full";
    return $"{session.Title}: {availability}";
});

Console.WriteLine(string.Join(Environment.NewLine, descriptions));

ステートメントラムダを簡潔に保ちます。 本体に複数のステップが必要な場合、または同じロジックが複数回出現する場合は、ローカル関数または通常のメソッドを使用して、動作にわかりやすい名前を付けます。

周囲のスコープから値をキャプチャする

ラムダは、周囲のメソッドで宣言された変数を使用できます。 この使用は キャプチャと呼ばれます。 最初の例では、選択ラムダは maximumMinutesキャプチャします。

int maximumMinutes = 60;
var shortSessions = sessions.Where(
    session => session.DurationMinutes <= maximumMinutes);

キャプチャは、短いルールでローカル コンテキストを使用するのに役立ちます。 ラムダは、その値のコピーではなく、変数自体をキャプチャします。 ラムダが実行される前に変数が変更された場合、ラムダは現在の値を確認します。

必要なコンテキストを簡単に識別できるようにします。 ラムダが周囲の状態を必要としない場合は、誤ってキャプチャされないように static を追加し、その独立をリーダーに表示します。

var openSessions = sessions.Where(
    static session => session.Registered < session.Capacity);

静的ラムダでは、パラメーター、宣言する値、定数、および静的メンバーを使用できます。 周囲のコードからローカル変数やインスタンス状態を使用することはできません。

ラムダ、メソッド グループ、またはローカル関数を選択する

いくつかの C# フォームは、デリゲート パラメーターに動作を提供できます。

  • 呼び出しの横で明確に読み取る短い動作には ラムダ式 を使用します。
  • 既存の メソッド に必要なシグネチャがあり、その名前が動作を説明している場合は、メソッド グループを使用します。
  • 含むメンバーに再利用可能な名前付きロジック、再帰、またはインライン ラムダに対して大きすぎる本文が必要な場合は、 ローカル関数 を使用します。
  • 複数のメンバーが動作を必要とする場合は 、通常のメソッド を使用します。

メソッド グループは、引数リストのないメソッド名です。 コンパイラは、一致するメソッドを必要なデリゲート型に変換します。

var openSessions = sessions.Where(HasOpenSeats);

foreach (WorkshopSession session in openSessions)
{
    Console.WriteLine($"Open: {session.Title}");
}

static bool HasOpenSeats(WorkshopSession session) =>
    session.Registered < session.Capacity;

Where(HasOpenSeats) は、コードが少ない Where(session => HasOpenSeats(session)) と同じ規則を伝えます。 メソッド名は、ルールがテストする内容を読者に伝えます。インライン比較は、そのルールをテストする方法を示しています。 ラムダ ラッパーは、引数の追加、操作の結合、または呼び出しのクリア時に保持します。

詳細なローカル比較については、「 ローカル関数」を参照してください。

参照