本文へスキップ
BecomeCoder

C#オブジェクト指向コース · 第4章 ジェネリクスとデリゲート · レッスン31

ラムダ式と Predicate

ブラウザで完結

導入

ラムダ式引数 => 式)は、処理を「その場で」渡すための記法です。特に「条件」を渡す場面が多く、boolを返す処理はPredicateFunc<T, bool>として、Whereなどと同じ考え方で使われます。

図解

flowchart LR
    L["n => n % 2 == 0<br/>(引数 => 条件)"] --> P["条件(bool を返す処理)"]
    P --> USE["Where / RemoveAll / Find などに渡す"]

サンプル

var numbers = new List<int> { 1, 2, 3, 4, 5, 6 };

// bool を返すラムダ(条件)を、メソッドに渡す
Predicate<int> isEven = n => n % 2 == 0;
Console.WriteLine(isEven(4));   // True

// List.FindAll は条件(Predicate)に合う要素を集める
var evens = numbers.FindAll(isEven);
Console.WriteLine(string.Join(", ", evens));   // 2, 4, 6

// 条件をその場で渡すのが一般的
var big = numbers.FindAll(n => n >= 4);
Console.WriteLine(string.Join(", ", big));     // 4, 5, 6
  • ラムダ式引数 => 式で処理をその場に書く
  • boolを返す処理=条件Predicate<T>Func<T, bool>で表す
  • FindAll/RemoveAll/Whereなど、多くのメソッドが条件ラムダを受け取る

演習

var words = new List<string> { "apple", "kiwi", "banana", "fig" };

// TODO: FindAll と条件ラムダで「5文字以上の単語」を集め、カンマ区切り出力してください
//       (apple, banana)
___
  • 期待される出力: apple, banana
ヒント1を見る

words.FindAll(w => w.Length >= 5)

ヒント2を見る

Console.WriteLine(string.Join(", ", words.FindAll(w => w.Length >= 5)));

まとめ

  • ラムダ式引数 => 式で処理をその場に渡す
  • boolを返すラムダ=条件(Predicate/Func<T,bool>
  • 多くの標準メソッドが条件ラムダを受け取る

次回: ラムダが外の変数を捕まえる「クロージャ」です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。