【发布时间】:2013-04-27 20:43:05
【问题描述】:
我正在编写一个时间表代码。我正在使用与这些模块相关的大学模块和事件系统,即
模块 CSC3039 Event1 - 讲座 Event2 - 讲座 Event3 - 实用等
我需要检查模块中每个事件的时间并比较冲突。冲突不需要纠正,只需突出显示即可。我将使用的表是Events,其中包含Event_ID (PK), Module_code (FK), Start_Date_Time, End_Date_Time 以及其他无关紧要的字段。我发现我需要实现一个For Each 语句,最终导致一个 if 语句,例如:
如果 (startTime1 = startTime2) CLASH
我的问题是试图在这里找出实际的 for 循环。我不知道该写什么来声明我的开始时间和结束时间。我认为这是获取 event1 并获取其开始和结束然后检查事件 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
在尝试将事件添加到我的数组列表时,我注意到在调试中没有事件发送到列表。
【问题讨论】:
-
好的,现在这是 linq 特定的,我从未使用过 linq,所以我不知道这些东西。您需要以某种方式获取 eventTime 的第 i 个元素。在调试时将鼠标放在它上面,看看 eventTime 是什么类型的对象,然后用谷歌搜索它什么的。您还可以从 gridview 中获取所有信息,这可能会更容易。
-
您可能应该使用包含/排除范围,而不是完全包含范围。请参阅 my answer 以了解最近发布的类似问题。
标签: vb.net linq datetime overlap