RCIE-ジャンクのコード屋

主に自分のためにコーディングのTIPSを蓄積しています。

(C#)インナー関数を使わずに、ラムダ式で関数内に関数を書く

解説

 C#7.0で、関数の中に関数を書く「インナー関数」がサポートされました。それ以前のバージョンでは、関数内に関数を書くためには、ラムダ式を使う必要があります。今回はラムダ式を使って関数内関数を書いてみます。

前提

C#3.5以降

コード

// n個の中からr個を選ぶ組み合わせ
static int nCr(int n, int r) {
	// 10P3 = 10 * 9 * 8 の nPr 関数を定義する。
	Func<int, int, int> nPr = (N, R) => {
		int result = 1;
		for (int i = N - R + 1; i <= N; i++) {
			result *= N;
		}
		return result;
	};

	// 10C3 = (10 * 9 * 8) / (1 * 2 * 3)
	return nPr(n, r) / nPr(r, r);
}
Func<引数型, 引数型, 返却型> f = (引数, 引数) => {
    関数の中身
};

補足

 ラムダ式の中では、定義されたローカル変数を参照することができます。上の例の N, R を n, r にすると、変数名前被りでエラーになります。
 ラムダ式の引数の数は、増やすことができます。

Func<引数型, 引数型, 引数型, 引数型, 引数型, 返却型> f = (引数, 引数, 引数, 引数, 引数) => {
    関数の中身