拆分 DateTimes 范围的有效方法

Effecient way to split range of DateTimes

我有两个 DateTime,X 和 Y。其中 X 总是出现在 Y 之前。它们可能相隔几毫秒到几年。我如何在 C# 中在日期结束 (00:00) 有效地将它们拆分?

E.g (24h clock)

X: 2010-01-01 14:00
Y: 2010-01-02 11:00
Result
2010-01-01 14:00 - 2010-01-02 00:00
2010-01-02 00:00 - 2010-01-02 11:00

-

X: 2010-01-01 05:00
Y: 2010-01-03 18:00
Result
2010-01-01 05:00 - 2010-01-02 00:00
2010-01-02 00:00 - 2010-01-03 00:00
2010-01-03 00:00 - 2010-01-03 18:00

-

X: 2010-01-01 05:00
Y: 2010-01-01 06:00
Result
2010-01-01 05:00 - 2010-01-01 06:00

-

X: 2010-01-01 02:00
Y: 2010-01-04 22:00
Result
2010-01-01 02:00 - 2010-01-02 00:00
2010-01-02 00:00 - 2010-01-03 00:00
2010-01-03 00:00 - 2010-01-04 00:00
2010-01-04 00:00 - 2010-01-04 22:00

这是一种可以进行所需分区的方法。请注意,没有检查以确保初始 startend.

之前
public IEnumerable<(DateTime Start, DateTime End)> DaySplit(DateTime start, DateTime end)
{
    var partition = start.AddDays(1).Date;
    while(partition < end)
    {
        yield return (start, partition);
        start = partition;
        partition = start.AddDays(1);
    }

    yield return (start, end);
}

请注意,这将延迟创建范围,因此您必须迭代它以在 foreach 循环中或通过调用 ToListToArray 来获取值。此外,它还使用 C# 7 中的值元组。您可以改为使用 Tuple<DateTime, DateTime> 或自定义类型。