2014-07-12 50 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