先にFunc<T,U>の拡張メソッドの定義と実装。この下の利用例から見たほうがわかりやすいかも。
public static class FuncUtils
{
public static Func<TSource, TResult> Compose<TSource, TResult>(
this Func<TSource, int> funcSelector,
params Func<TSource, TResult>[] functionCandidates)
{
Expression<Func<TSource, TResult>> ret = t0
=> functionCandidates[funcSelector(t0)](t0); return ret.Compile();
}
}
とかやっておいて、
Func<int, string> fNum = n => n.ToString();
Func<int, string> fFizz = n => “Fizz”;
Func<int, string> fBuzz = n => “Buzz”;
Func<int, string> fFizzBuzz = n => “FizzBuzz”;Func<int, int> selector = n
=> (n % 15 == 0) ? 3
: (n % 5 == 0) ? 2
: (n % 3 == 0) ? 1
: 0;var fizzbuzz = selector.Compose(fNum, fFizz, fBuzz, fFizzBuzz);
Enumerable.Range(1, 100).ToList().ForEach(n
=> Console.WriteLine(fizzbuzz(n)));
うはw キタコレwww
あ、Fizz Buzz 問題をややこしく解こうと思っただけです。
Fizz Buzz – Wikipedia
http://ja.wikipedia.org/wiki/Fizz_Buzz
一応解説しておくと、Combine() は、
「ある引数を取り、それを元にその引数を渡すべき他のメソッドを決定して結果を得るようなメソッドを生成する」メソッド
わかった?w 俺が読んでる立場だったら、たぶん理解不能なので FizzBuzz で説明すると、
「ある引数(int)を取り、それを元にその引数(int)を渡すべき他のメソッド(int を「そのまま」とか”Fizz”とか”Buzz”とかに変換する)を決定して結果を得るようなメソッド(fizzbuzz)を生成する」メソッド
まあ、そんなかんじ。マトリョーシカ!