2014年11月12日

C#でn日後を返す関数を返す関数を定義する

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その48

■問題 (出題者: にしお さん)
整数nを渡すと「日時のデータを受け取って、n日後の日時を返す関数」を返す関数を作ってください。 関数を返す関数が作れない場合は、関数の代わりになるようなオブジェクトでも構いません。
出題の意図としては「関数を返す関数」と「日時の差分の扱い方」を、それぞれ単体だと簡単すぎるので合わせ技にしてみた、というところです。

「n日後を返す関数」ではなくて、「n日後を返す関数」を返す関数 を定義せよ、という問題です。

C#では、デリゲートを返すメソッドを定義すれば良いということですね。
GetFuncNDaysLater というメソッドを定義し、その戻り値を Func<DateTime, DateTime> デリゲートとしました。
ラムダ式便利ですね。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            var FiveDaysLater = GetFuncNDaysLater(5);
            Console.WriteLine("{0:d}", FiveDaysLater(DateTime.Today));
            Console.WriteLine("{0:d}", FiveDaysLater(new DateTime(2014, 12, 27)));
            Console.WriteLine("{0:d}", FiveDaysLater(new DateTime(2038, 1, 30)));
            Console.ReadLine();

        }

        // 「日付を受け取り日付を返す関数」が戻り値なので、
        // 戻り値は、Func<DateTime, DateTime> ですね。
        // ラムダ式は、デリゲートに変換できるので、ラムダ式を返せばよい。
        static Func<DateTime, DateTime> GetFuncNDaysLater(int n) {
            return (DateTime dt) => { return dt.AddDays(n); };
        }

    }
}



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52384214