2010-10-14 88 views
0

我有一組假期日期。這些總是會在工作日。可以說什麼是找到連續日期列表的最快方法

DateTime[] dates = new DateTime[] {"1/8/2010","1/3/2010","1/6/2010","1/7/2010","1/21/2010"} 

我現在有一個單一的輸入日期。可以說:

DateTime vacationDateToCheck = 1/7/2010; 

我想找到假設集(日期列表)給定上述集。特別是,我想要列表的第一個和最後一個日期。

因此,舉例來說,如果我在vacationDateToCheck變量(1/7/2010)通過我還是會回到

是的,你是在度假從1/6/2010到1/8/2010。

如果我在1/4/2010傳遞它將返回一個空的結果。

這是踢球者。我希望它在週末時分,並在週末時分。所以如果我在週五和下週一有一個假期,我會希望它包括作爲一個列表。

有什麼建議嗎?

+1

您可以使用ISO 8601日期格式還是指定部件的順序? – Joey 2010-10-14 12:11:45

+0

是否將假期天數作爲單獨的天數列表進行存儲?這不是最好的方式,這使得這項任務變得更加困難。 – Lazarus 2010-10-14 12:13:47

+0

另外,你將如何應對假期,跨越一個週末?週末的日子是否會被列入假期日的列表中,或者爲了您的功能目的,會將第1周開始的假期和第2周結束的假期視爲兩個單獨的假期? – Lazarus 2010-10-14 12:15:39

回答

3

首先,如果重要的是將訂單保留在原始列表中,則必須對數組進行排序,或者至少進行排序。如果你不這樣做,這並不容易。

然後,找到您要檢查的元素的索引。一旦你完成了這些,創建一個循環前進,一個在你的數組中倒退,並計算你在循環中達到的日期,如果這兩個日期是有收益的;否則,停止該循環(並且如果你還沒有完成那麼做另一個循環)。

這裏假設您在尋找範圍內的全部天都可以在列表中找到,包括週末和節假日。

編輯:如果你想包含週末暗含,你必須檢查工作日使用DayOfWeek迭代的日子。最簡單的方法就是在下一個預期日期保持一個變量;你的循環中的每一次迭代,你在某一天添加​​(或減去,當向後移動排序後的數組時)。如果您正在處理的那一天是星期五(或週一向後移動),請添加/減去另外兩天以跳過週末。

這裏有基本的想法(未經測試,但你應該明白)。我假設你已經排序了dates,並且你已經在你的數組中找到了初始日期(在索引i處)。爲了簡單起見,我還假設vacationDateToCheck從來不是星期六或星期天;如果它可以是其中的任何一個,那麼您必須相應地進行調整。

DateTime expectedDate = vacationDateToCheck.AddDays(1); 
if (vacationDateToCheck.DayOfWeek == DayOfWeek.Friday) 
    expectedDate = expectedDate.AddDays(2); 
DateTime startDate = vacationDateToCheck; 
DateTime endDate = vacationDateToCheck; 
for (int j = i + 1; i < dates.Length; i++) { 
    if (dates[i] == expectedDate) { 
    endDate = dates[i]; 
    expectedDate = dates[i].AddDays(1); 
    if (dates[i].DayOfWeek == DayOfWeek.Friday) 
     expectedDate = expectedDate.AddDays(2); 
    } 
    else 
    { 
    break; 
    } 
} 

迭代的另一種方式是類似的,只是你加-1和-2天,而不是和你檢查一週中的一天是星期一。

+0

更難以閱讀更新的問題。我希望它能夠隱含地瞭解週末 – leora 2010-10-14 12:24:30

相關問題