2013-04-27 72 views
0

我正在制定一個時間表的一段代碼。我使用的大學模塊和相關於這些模塊事件的系統,即比較重疊的日期 - 不避免

模塊CSC3039 事件1 - 講座 事件2 - 講座 EVENT3 - Practial等

我需要檢查每一個事件的時間在模塊相互對抗並比較衝突。衝突不需要糾正,只是突出顯示。我將使用的表格是Events,其中包含Event_ID (PK), Module_code (FK), Start_Date_Time, End_Date_Time加上其他無關緊要的字段。我已經想通了,我需要實現一個For Each聲明,最終導致if語句如:

如果(startTime1 < = endTime2或endTime1> = startTime2)CLASH

我的問題是試圖找出這裏的實際循環。我不知道該寫什麼來宣佈我的開始時間和結束時間。我認爲這是一個事件1並獲取其開始和結束,然後檢查事件2,3或4是否符合上述if語句的情況。我試圖得到這個,但可以真正使用一些指導。

編輯...基於下面的建議我已經實現了下面的代碼:

'return all relevant tables from the Modules database, based on the module code entered by the user. 
    Dim eventTime = (From mods In db.Modules 
        Join evnt In db.Events On mods.Module_code Equals evnt.Module_code 
        Join rm In db.Rooms On rm.Room_ID Equals evnt.Room_ID 
        Join build In db.Buildings On build.Building_code Equals rm.Building_code 
        Where ((mods.Module_code = initialModCode) And (evnt.Room_ID = rm.Room_ID)) 
        Select evnt.Event_ID, evnt.Module_code, evnt.Event_type, evnt.Start_Date_Time, evnt.End_Date_Time, build.Building_code, rm.Room_Number) 


    'use the gridview to display the result returned by the above query 
    gdvEventsTable.DataSource = eventTime 
    gdvEventsTable.DataBind() 

    Dim listClashes As New List(Of Array) 

    For i As Integer = 0 To eventTime.Count - 1 
     For j As Integer = i + 1 To eventTime.Count - 1 
      If (eventTime.ToList(i).Start_Date_Time < eventTime.ToList(j).End_Date_Time) And (eventTime.ToList(i).End_Date_Time > eventTime.ToList(j).Start_Date_Time) Then 
       MsgBox("Clash", MsgBoxStyle.MsgBoxSetForeground, "") 
       listClashes.Add(eventTime) 
      Else 
       MsgBox("No Clash", MsgBoxStyle.MsgBoxSetForeground, "") 
      End If 
     Next 
    Next 

當試圖將事件添加到我的數組列表,我注意到,在調試,沒有事件發送到名單。

+0

好吧,現在這是越來越linq具體,我從來沒有使用linq,所以我不知道這個東西。您需要以某種方式獲取eventTime的第i個元素。在調試時將鼠標放在它上面,以查看eventTime是什麼類型的對象,然後將它放到Google或其他位置。你也可以從gridview中獲得所有的信息,這可能會更容易。 – 2013-04-28 20:09:59

+0

你應該使用包容/排他的範圍,而不是完全包含的範圍。看到[我的回答](http://stackoverflow.com/a/16282246/634824)剛剛發佈的類似問題。 – 2013-04-29 15:31:05

回答

1

如果你想這是一個數組或某種收集的事件的所有成對比較,你可以用這樣一個循環:

Dim ModuleEventArray() As ModuleEvent 
    '... 
    For i As Integer = 0 To ModuleEventArray.Length - 1 
     For j As Integer = i + 1 To ModuleEventArray.Length - 1 
      'test if ModuleEventArray(i) overlaps with ModuleEventArray(j) 
     Next 
    Next 

ModuleEvent這裏將是另一個類或結構有字段startTime和endTime。測試

if (startTime1 <= endTime2 or endTime1 >= startTime2) 

是不夠的測試重疊,但也許你可以計算出正確的測試自己:)


編輯: 因爲我看你使用某種形式的集合,而不是數組,你需要的代碼應該是這樣的:

For i As Integer = 0 To eventTime.Count - 1 
    For j As Integer = i + 1 To eventTime.Count - 1 
     If (eventTime.Item(i).Start_Date_Time < eventTime.Item(j).End_Date_Time) And (eventTime.Item(i).End_Date_Time > eventTime.Item(j).Start_Date_Time) Then 
      MsgBox("Clash") 
     Else 
      MsgBox("No Clash") 
     End If 
    Next 
Next 
+0

感謝@SauliusŠimčikas的簡化。我很感激。該代碼沒有工作,因爲它不喜歡'eventTime.Item'行。我改變了這個'eventTime.ToList'似乎已經工作,但我無法發送衝突事件到我的數組列表。我已更新我的問題以顯示我現在使用的代碼。請給我你的想法。提前致謝。 – Gavin 2013-04-28 18:09:27

0

之前,你寫你的代碼,你需要首先決定你的算法將是。例如,如果您使用您所設想的樸素方法,則代碼確實很簡單(基本上是2個嵌套循環),但是如果O(n²)是複雜的。

根據您擁有的數據量,數據庫中是否有數據,您預期衝突的可能性,您是否始終在開始時擁有完整事件列表,或者您需要逐步查找衝突等。不同的解決方案可能是首選。其中一個考慮因素是您是否需要將列表劃分爲非衝突事件集或者只是產生一個是/否的答案(每個事件一個),說明是否存在衝突。

您可能會考慮做一些不同的事情,比如在開始比較之前按開始時間排序列表。這將允許你只走一次列表。

+0

感謝您的輸入@Celada。由於我是一個沒有經驗的編碼員,因此我的頭腦有點過分了。數據位於數據庫中,不會包含大量數據。衝突可以說是頻繁的。我不知道你的意思是O(n2) – Gavin 2013-04-27 23:57:13

0

我的比較來自數據庫。在下面的代碼之前,我有一個查詢,根據Module_Code的用戶輸入,從我的Events表中返回所有記錄。這段代碼將通過msgbox顯示衝突。我會改變它來填充一個列表。這不是最漂亮的,可能會導致很多重複,但它實現了我的主要目標。

For Each evnt In eventTime 


     Dim startTime1 = evnt.Start_Date_Time 

     Dim endTime1 = evnt.End_Date_Time 

     For Each evat In eventTime 
      Dim startTime2 = evat.Start_Date_Time 


      Dim endTime2 = evat.End_Date_Time 



      If (startTime1 < endTime2) And (endTime1 > startTime2) Then 
       MsgBox("Clash") 
      Else 
       MsgBox("No Clash") 
      End If 

     Next 

    Next 
+0

這段代碼可以工作,但它是非常無效的。您正在對每一對進行兩次測試,並且針對自己測試每個事件,並且如果您需要它們,還應該在循環外部聲明變量。 – 2013-04-28 00:04:52

+0

Hi @SauliusŠimčikas感謝您的評論。你能否提出一個更好的選擇,即使在僞代碼中?如前所述,我是這方面的新手,並且花了6個小時才弄到這一點。 – Gavin 2013-04-28 00:12:23

+0

我已經在我的答案中做過。我剛剛編輯過,讓你更容易理解。 – 2013-04-28 00:38:25