2014-07-12 49 views
-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); 
} 
+3

你试过调试过吗?这应该有助于解决问题。 – MarcinJuraszek

+0

如果你有一个循环,并且你内存不足,那么最有可能的原因是循环是_infinite_。 –

+0

@MichaelPetrotta'datum.AddMinutes(interval) - datum'产生一个timepsan – totalitarian

回答

0

你应该比较日期timespans.In您例如dt <= end代码会从一开始就假的,因为23:55是大于00:10.Instead尝试像这样使用日期时间(创建日期假像我这样做,或者如果你是这背后例如使用日期时间比较好,一旦你看到它,你就会明白):

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 
2

你基准值的从来没有在这里变化,所以你一遍又一遍地在同一时间循环。你不是从头到尾,而是从数据开始(现在开始),然后每次迭代将dt设置为datum.addMinutes(interval) - 数据。

+0

不加addMinutes(间隔)改变数据? – totalitarian

+0

可能,我不确定。也就是说,它始终不会从头到尾,也可能超出此范围,除非结局在将来。 – shortstuffsushi

+0

不仅数据不会改变(因为它从来没有改变任何地方),但dt从来没有真正改变(尽管被改变)。因此无限循环。每次dt获得5分钟添加到基准,但是然后你减去旧的基准。这相当于使dt在每次迭代中有5分钟的时间跨度。 –

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(); 
+0

谢谢。我发现Linq很难将我的头包裹起来。还有结束时间没有把它列入清单 – totalitarian

+0

@totalitarian在((int)(diff.TotalMinutes/interval)后加+1)' –

+0

谢谢,但它似乎没有工作。 '指定的参数超出了有效值的范围。 参数名称:count' – totalitarian