将日期范围拆分为日期范围块

Kha*_*han 15 .net c#

我正在寻找一种方法,按日块大小将日期范围分成一系列日期范围.我打算用它来缓冲对服务的调用,如果日期范围太大,服务就会出错.

这是我到目前为止所提出的.它似乎工作,但我不确定它是否会正常退出.这看起来像以前可能做过几次,但我找不到它.

public IEnumerable<Tuple<DateTime, DateTime>> SplitDateRange(DateTime start, DateTime end, int dayChunkSize)
{
    var newStart = start;
    var newEnd = start.AddDays(dayChunkSize);

    while (true)
    {
        yield return new Tuple<DateTime, DateTime>(newStart, newEnd);

        if (newEnd == end)
            yield break;

        newStart = newStart.AddDays(dayChunkSize);
        newEnd = (newEnd.AddDays(dayChunkSize) > end ? end : newEnd.AddDays(dayChunkSize));
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找改进建议,或者"伙计,使用这个现有功能!"

Tom*_*sup 31

我认为当开始和结束之间的差异小于dayChunkSize时,您的代码会失败.看到这个:

var singleRange = SplitDateRange(DateTime.Now, DateTime.Now.AddDays(7), dayChunkSize: 15).ToList();
Debug.Assert(singleRange.Count == 1);
Run Code Online (Sandbox Code Playgroud)

建议的解决方案:

 public static IEnumerable<Tuple<DateTime, DateTime>> SplitDateRange(DateTime start, DateTime end, int dayChunkSize)
    {
        DateTime chunkEnd;
        while ((chunkEnd = start.AddDays(dayChunkSize)) < end)
        {
            yield return Tuple.Create(start, chunkEnd);
            start = chunkEnd;
        }
        yield return Tuple.Create(start, end);
    }
Run Code Online (Sandbox Code Playgroud)