C#のコードを眺めていると
var ret = list.Where( n => 0 < n );
のような書き方を見る事があります。
この、メソッドの引数の部分。C#に慣れていない人は、なにこれ?ってなるんじゃないでしょうか?
これ、C#3.0から導入されたラムダ式と言います。
今回はこのラムダ式についてまとめてみようと思います。
その前にデリゲート(delegate)を理解する
ラムダ式を理解する為には、まずデリゲート(delegate)を理解する必要があります。
デリゲートを簡単に説明すると、関数を変数のように扱う為のものです。
変数のように扱えれば、関数の引数に関数を渡す事ができます。
引数に関数が渡せれば、計算式の一部だけを簡単に差し替える事ができます。
※デリゲートを更に詳しく知るには「C#のデリゲート (delegate) って何?」をご覧ください
コードサンプル
以下の例はList<int>を継承したクラスですが、条件に合う要素だけを抜き出すWhereメソッドを作ってみました。この「条件に合う」という部分にdelegateを使っています。
public delegate bool TestDelegate(int n); public class TestList : List<int> { public TestList Where(TestDelegate func) { var list = new TestList(); foreach (var obj in this) { if (func(obj)) { list.Add(obj); } } return list; } }
このクラスを使った例が以下のものです。
引数に匿名メソッドを記述して、値が0より大きい要素を抜き出しています。
var list = new TestList(); list.Add(0); list.Add(1); list.Add(2); var result = list.Where( delegate (int n) { if (0 < n) return true; else return false; });
※匿名メソッドを更に詳しく知るには「C#のデリゲートを手軽にする匿名メソッド」をご覧ください
ラムダ式は匿名メソッドを簡略化したもの
デリゲートが分かったところでラムダ式の話に移ります。
ざっくり言うとラムダ式は匿名メソッドを簡略化して記述したものになります。
上記の例を少し簡単にしてみましょう。
var list = new TestList(); list.Add(0); list.Add(1); list.Add(2); var result = list.Where( delegate (int n) { return (0 < n); });
このdelegateキーワードを演算子=>に置き換えたものがラムダ式です。
var result = list.Where( (int n) => { return (0 < n); });
C#には型推論という機構があります。
この型推論機構のおかげでラムダ式は、引数の型の記述を省略する事ができます。
var result = list.Where( (n) => { return 0 < n; });
関数の中身が1行の場合、{}もreturnも省略する事ができます。
var result = list.Where((n) => 0 < n);
delegateの引数が1つだけの場合は()も省略する事ができます。
var result = list.Where(n => 0 < n);
ちなみにdelegateの引数が2つの場合は()が必要になります。
public delegate bool TestDelegate(int n1, int n2);
var result = list.xxxx((n1, n2) => (0 < n1) && (0 < n2));
関連記事
- C#のコンストラクタでオーバーロード
- C#のコンストラクタの継承
- C#のジェネリックを使おう
- C#のデリゲート (delegate) って何?
- C#のデリゲートお手軽にする匿名メソッド
- C#のラムダ式【=>】って何?
- C#で基底クラスのメソッドを置き換えるオーバーライド
- C#でキャストとas演算子を使いこなす
- C#で型を判別するtypeofとis演算子
- C#の値型でもnullを扱えるようにするNullable
- C#のリソース解放にはIDisposableとusingを使おう
- C#のStringとstring、Int32とint 違いは・・・ない!
- C#でasync/awaitを使った非同期処理
- C#で文字列を指定の区切り文字で分割
- C#のstring.Formatで桁数や書式を指定する
- C#の配列やListをソートする
- C#の配列やListを検索する (Find,FindAll,FindIndex)
- C#の配列やListを高速に検索する (BinarySearch)
- C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)
- C#の配列の中に条件を満たす要素が存在するかを調べる(LINQ Any)
- C#の配列から条件に合う要素を抽出する(LINQ Where)
- C#の配列で要素毎の処理結果を得る(LINQ Select)
- C#の配列を並び替える(LINQ OrderBy,ThenBy)
- C#の配列をグループ毎に処理する(LINQ GroupBy)
- C#の配列を内部結合(INNER JOIN)する(LINQ Join)
- C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)
- C#の配列の重複要素を削除する(LINQ Distinct)
- C#でフォルダ内のファイル名一覧を取得する
- C#でテキストファイルを読み込む
- C#でテキストファイルに書き込む
- C#でバイナリファイルを読み込む
- C#でバイナリファイルに書き込む
コメントをお書きください