2014-04-01 4 views
1

의 다른 기간에서 시간의 기간을 제거하는 재귀 함수가 필요합니다. 나는 작업중인 프로젝트에서 약속을 처리합니다. 사람들이 약속을 요청할 수있는 시간대를 걸러 낼 때 나는 걸림돌을 때렸다.나는 이것이 내 첫 번째 질문입니다 나는 가능한 한 명확하게하려고합니다 시간

Public Class TimePeriod 
    #Region "Private Variables" 
     Private _startTime As TimeSpan 
     Private _endTime As TimeSpan 
    #End Region 

    #Region "Public Properties" 
     Public Property StartTime As TimeSpan 
      Get 
       Return Me._startTime 
      End Get 
      Set(value As TimeSpan) 
       Me._startTime = value 
      End Set 
     End Property 
     Public Property EndTime As TimeSpan 
      Get 
       Return Me._endTime 
      End Get 
      Set(value As TimeSpan) 
       Me._endTime = value 
      End Set 
     End Property 
    #End Region 

    #Region "Constructors" 
     Public Sub New() 
      Me.New(New TimeSpan(0, 0, 0), New TimeSpan(0, 0, 0)) 
     End Sub 
     Public Sub New(StartTime As TimeSpan, EndTime As TimeSpan) 
      Me._startTime = StartTime 
      Me._endTime = EndTime 
     End Sub 
    #End Region 
End Class 

Public Class TimePeriodFunctions 
    Public Shared Function RemoveTimePeriod(MasterTimePeriod As TimePeriod, TimePeriodToRemove As TimePeriod) As System.Collections.Generic.List(Of TimePeriod) 
     'SEE FIRST IF THERE IS ANY OVERLAP 
     If (TimePeriodToRemove.StartTime >= MasterTimePeriod.StartTime And TimePeriodToRemove.StartTime <= MasterTimePeriod.EndTime) Or _ 
      (TimePeriodToRemove.EndTime >= MasterTimePeriod.StartTime And TimePeriodToRemove.EndTime <= MasterTimePeriod.EndTime) Then 
      Dim TimePeriods As New System.Collections.Generic.List(Of TimePeriod) 

      If TimePeriodToRemove.StartTime >= MasterTimePeriod.StartTime And TimePeriodToRemove.StartTime <= MasterTimePeriod.EndTime And _ 
       MasterTimePeriod.StartTime <> TimePeriodToRemove.StartTime Then 
       'TIME TO RETURN IS FROM MASTERTIMEPERIOD.STARTTIME TO TIMEPERIODTOREMOVE.STARTTIME 
       TimePeriods.Add(New TimePeriod(MasterTimePeriod.StartTime, TimePeriodToRemove.StartTime)) 
      End If 
      If TimePeriodToRemove.EndTime >= MasterTimePeriod.StartTime And TimePeriodToRemove.EndTime <= MasterTimePeriod.EndTime And _ 
       TimePeriodToRemove.EndTime <> MasterTimePeriod.EndTime Then 
       'TIME TO RETURN IS FROM TIMEPERIODTOREMOVE.ENDTIME TO MASTERTIMEPERIOD.ENDTIME 
       TimePeriods.Add(New TimePeriod(TimePeriodToRemove.EndTime, MasterTimePeriod.EndTime)) 
      End If 

      Return TimePeriods 
     Else 
      'IF THERE IS NO OVERLAP, THEN RETURN AN EMPTY COLLECTION 
      Return New System.Collections.Generic.List(Of TimePeriod) 
     End If 
    End Function 
End Class 

을 지금은 상영으로 = 9:00 ENDTIME = 5:00 약속을 할 가능 기간을 나타내는 TimePeriod이있는 경우, 그리고 : 나는 다음과 같이 일정 기간 동안 클래스를 정의 현재 예약 된 여러 가지 약속 (예 : 9 : 30-10 : 00, 10 : 00-11 : 00)의 일반적인 목록이 있습니다. 반복 가능한 함수를 작성하여 사용 가능한 기간의 일반적인 목록을 반환하는 방법은 무엇입니까? 사용 가능한 기간에서 청크가 제거되지 않은 경우 제거)?

답변

1

설정 어쩌면 IsBusy라는 이름의 TimePeriod 클래스의 부울 속성입니다. 그런 다음 IsBusy = False 인 목록을 쿼리하기 위해 람다 (lambda)를 작성할 수 있습니다.

사이드 노트로 미리 작성된 시간 블록 목록 (예 : 15 분 단위)을 사용하는 것이 더 바람직하지 않겠습니까? 누군가 9시에서 9시 45 분까지 차단하려는 경우 세 개의 TimePeriod를 찾고 IsBusy를 True로 업데이트하기 위해 목록을 반복하면됩니다 (람다에서도 가능). 각 시작 및 종료 시간이 서로 다른 시간 간격을두면 목록의 모든 항목을 테스트하여 예약 된 이벤트와 충돌이 있는지 확인합니다.