4

2 つの の間の時間のリストを包括的に提供する関数を作成しましたDateTime

しかし、結局のところ、非常に読みやすいとは言えず、私が取り組んでいるプロジェクトでは単体テストがまったく行われていないにもかかわらず、単体テストを実行したくなります。

だから私の質問は、これを書くためのより読みやすく、または効率的な方法はありますか?:

コード:

private List<DateTime> GetHoursForEvent(DateTime start, DateTime end)
{
    var hours = new List<DateTime>();

    DateTime startFloor = Convert.ToDateTime(start.ToString("MM/dd/yyyy HH:00:00"));
    DateTime endFloor = Convert.ToDateTime(end.ToString("MM/dd/yyyy HH:00:00"));

    for (double dblDate = startFloor.ToOADate(); 
         dblDate <= endFloor.ToOADate(); 
         dblDate += (1.0 / 24.0))
    {
        hours.Add(DateTime.FromOADate(dblDate));
    }

    return hours;
}

入力:

DateTime start = Convert.ToDateTime("2012-04-01 04:22:00");
DateTime end   = Convert.ToDateTime("2012-04-02 00:05:00");

結果:

2012-04-01 04:00:00
2012-04-01 05:00:00
2012-04-01 06:00:00
2012-04-01 07:00:00
2012-04-01 08:00:00
2012-04-01 09:00:00
2012-04-01 10:00:00
2012-04-01 11:00:00
2012-04-01 12:00:00
2012-04-01 13:00:00
2012-04-01 14:00:00
2012-04-01 15:00:00
2012-04-01 16:00:00
2012-04-01 17:00:00
2012-04-01 18:00:00
2012-04-01 19:00:00
2012-04-01 20:00:00
2012-04-01 21:00:00
2012-04-01 22:00:00
2012-04-01 23:00:00
2012-04-02 00:00:00

車輪を再発明しているような気がします。

4

2 に答える 2

9

ええ、このようなものはあなたにとってよりうまくいくはずです:

private List<DateTime> GetHoursForEvent(DateTime start, DateTime end)
{
    var hours = new List<DateTime>();
    var current = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0);
    while(current <= end)
    {
        hours.Add(current);
        current = current.AddHours(1);
    }
    return hours;
}

を返す必要がある特定の理由がない限り、これをストリーミング メソッドにすることもできますList

private IEnumerable<DateTime> GetHoursForEvent(DateTime start, DateTime end)
{
    var current = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0);
    while(current <= end)
    {
        yield return current;
        current = current.AddHours(1);
    }
}
于 2012-04-17T19:13:09.107 に答える
1

このコードを使用してみてください

private List<DateTime> GetHoursForEvent(DateTime start, DateTime end)
    {
        List<DateTime> hours = new List<DateTime>();
        while (start < end)
        {
            hours.Add(start);
            start = start.AddHours(1);
        }
        return hours;
    }
于 2012-04-17T19:18:00.127 に答える