我正在尝试创建2个时间跨度之间的时间跨度列表。例如
23:55 - > 00:10
应该给我
23:55
00:00
00:05
00:10
这是我的代码,但我得到内存不足异常
var times = new List<TimeSpan>();
int interval = 5;
TimeSpan start = TimeSpan.Parse("23:55");
TimeSpan end = TimeSpan.Parse("00:00");
DateTime datum = new DateTime();
for (var dt = start; dt <= end; dt = datum.AddMinutes(interval) - datum)
{
times.Add(dt);
}
答案 0 :(得分:2)
你的基准值在这里永远不会改变,因此你会一遍又一遍地循环同一时间。你不是从开始到结束,你是从数据(从现在开始)然后每次迭代设置dt到datum.addMinutes(interval) - datum。
答案 1 :(得分:1)
我怀疑你的循环是无限的:
dt = datum.AddMinutes(interval) - datum
datum
从未像interval
那样发生变化,因此dt
始终具有相同的值。
使用Linq而不是循环的更简洁的方法可以使用如下::
TimeSpan diff = end - start;
var times = Enumerable
.Range(0, (int)(diff.Minutes / interval) + 1)
.Select(x => start.Add(TimeSpan.FromMinutes(interval * x)))
.ToList();
答案 2 :(得分:1)
你应该将日期与时间跨度进行比较。在你的代码中,例如dt <= end
从一开始就是假的,因为23:55大于00:10。相反使用datetime尝试这样做(创建像我这样的虚假日期或者如果你更好地使用日期时间这个例子,一旦你看到它你会理解):
var times = new List<TimeSpan>();
double interval = 5;
//TimeSpan start = TimeSpan.Parse("23:55");
//TimeSpan end = TimeSpan.Parse("00:10");
DateTime starting = new DateTime(2014, 1, 1, 23, 55, 0);
DateTime ending = new DateTime(2014, 1, 2, 0, 10, 0);
for (var ts = starting; ts <= ending; ts = ts.AddMinutes(interval))
{
times.Add(ts.TimeOfDay);
}
输出:
23:55
00:00
00:05
00:10