没有定义时间范围的内置类型,但通过组合来创建一个非常容易DateTime
and a TimeSpan
。例如:
struct TimeRange
{
private readonly DateTime start;
private readonly TimeSpan duration;
public TimeRange ( DateTime start, TimeSpan duration )
{
this.start = start;
this.duration = duration;
}
}
然后你可以建立一个List<TimeRange>
使用特定的DateTime
作为起点并添加所需的TimeSpan
对于每个元素。例如,这是一个非常基本的实现TimeRange
包括一个名为的方法Split
它返回一个IEnumerable<TimeRange>
基于当前的TimeRange
以及子范围所需的持续时间。
struct TimeRange
{
private readonly DateTime start;
private readonly TimeSpan duration;
public TimeRange ( DateTime start, TimeSpan duration )
{
this.start = start;
this.duration = duration;
}
public DateTime From { get { return start; } }
public DateTime To { get { return start + duration; } }
public TimeSpan Duration { get { return duration; } }
public IEnumerable<TimeRange> Split (TimeSpan subDuration)
{
for (DateTime subRangeStart = From; subRangeStart < this.To; subRangeStart += subDuration)
{
yield return new TimeRange(subRangeStart, subDuration);
}
}
public override string ToString()
{
return String.Format ("{0} -> {1}", From, To);
}
}
然后你可以做这样的事情:
TimeRange mainRange = new TimeRange(DateTime.Now, new TimeSpan(12, 0, 0));
List<TimeRange> rangeList = mainRange.Split(new TimeSpan(1, 0, 0)).ToList();
这将给出从当前时间开始的 12 个持续时间为 1 小时的时间范围的列表。
** 更新 **
请注意,上面的实现是非常基本的。这Split
例如,如果子持续时间不是父范围的整除,则方法将愉快地生成一系列范围,其中最后一个子范围的末尾超出父范围的末尾。不过,为这种事情添加检查是很困难的。真正的问题是你希望在这种情况下发生什么。
创建一个静态的也很容易TimeRange.CreateList
方法构建了一个List<TimeRange>
不需要显式的父范围。