私は、2 つの特定の日付の間のすべての日 (月、火、水) を取得することが最善かつ最速の方法であると考えています。
曜日は、パラメータとしてコンマ区切りの文字列として Web サービスに渡されます。mon,tue,wed,
これは現時点での疑似コードです。
だから私の(疑似)コードは次のようになります
function Add(startdate, enddate, days)
{
dateList as New List(Of Date)
if days.split(',').count < 7 then
{
// This is the problem area.
}
while(startdate < enddate)
{
// do some processing of either the dates in dateList or just all days
}
}
私にとってこの問題は
1)
days
パラメータを配列に分割し、- 日の配列をループする
- それぞれ
day
の日数:- ~の間の各日付を
startdate
調べるenddate
- の場合、このメソッドの dateList に追加する
date.day
と、潜在的に (365 * 6) チェックが行われます (開始日と終了日が 1 年離れていると仮定します)。また、すべての日が選択されている場合は、それらをリストに入れることを無視できますday
- ~の間の各日付を
2)
- ~の間の各日付を
startdate
調べるenddate
- スイッチ (日付.曜日.tostring())
- case 'mon':if days.contains('mon') then addDatetoList
3)
everyday
~の間startdate
のそれぞれについてenddate
- if
days
.contains(everyday.dayofweek.tostring()) then addDatetoList
4)私が見落とした別の方法はありますか?これらはすべて完全に非効率的ですか?
計算は vb.net コードビハインドで行う必要があります。それ以外の場合は、SQL サーバーを使用して計算することを考えます。
編集
関数のタイミングの演習として、私はすぐに以下を構築して、私の方法や他の方法を試してみました。
Dim DaysOfWeek As String = "Monday,Tuesday,Friday"
Dim startDate As DateTime = DateTime.Now
Dim endDate As DateTime = DateTime.Now.AddDays(365)
Dim dateList As New List(Of DateTime)()
Dim method1StopWatch As New Stopwatch
Dim method2StopWatch As New Stopwatch
Dim method3StopWatch As New Stopwatch
Dim method4StopWatch As New Stopwatch
Dim executionStart As Long
Dim executionEnd As Long
Dim noDays As Integer = 0
'Method3
method3StopWatch.Start()
Do While (startDate < endDate)
If DaysOfWeek.Contains(startDate.DayOfWeek.ToString()) Then
dateList.Add(startDate)
noDays = noDays + 1
End If
startDate = startDate.AddDays(1)
Loop
method3StopWatch.Stop()
Label3.Text = method3StopWatch.ElapsedTicks.ToString() & " " & noDays & " Days"
noDays = 0
dateList.Clear()
startDate = DateTime.Now
'Method2
method2StopWatch.Start()
Do While (startDate < endDate)
Select startDate.DayOfWeek.ToString()
Case "Monday"
If DaysOfWeek.Contains("Monday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Tuesday"
If DaysOfWeek.Contains("Monday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Wednesday"
If DaysOfWeek.Contains("Wednesday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Thursday"
If DaysOfWeek.Contains("Thursday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Friday"
If DaysOfWeek.Contains("Friday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Saturday"
If DaysOfWeek.Contains("Saturday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Sunday"
If DaysOfWeek.Contains("Sunday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
End Select
startDate = startDate.AddDays(1)
Loop
method2StopWatch.Stop()
Label2.Text = (method2StopWatch.ElapsedTicks).ToString() & " " & noDays & " Days"
noDays = 0
dateList.Clear()
startDate = DateTime.Now
method1StopWatch.Start()
For Each Day As String In DaysOfWeek.Split(CChar(","))
Do While (startDate < endDate)
If startDate.DayOfWeek.ToString() = Day Then
noDays = noDays + 1
dateList.Add(startDate)
End If
startDate = startDate.AddDays(1)
Loop
startDate = DateTime.Now
Next
method1StopWatch.Stop()
Label1.Text = (method1StopWatch.ElapsedTicks).ToString() & " " & noDays & " Days"
noDays = 0
dateList.Clear()
startDate = DateTime.Now
method4StopWatch.Start()
Dim daysList As New List(Of DayOfWeek)()
daysList.Add(DayOfWeek.Monday)
daysList.Add(DayOfWeek.Tuesday)
daysList.Add(DayOfWeek.Friday)
Dim datesList As List(Of Date) = GetDayOfWeekDates(startDate, endDate, daysList)
method4StopWatch.Stop()
Label4.Text = (method4StopWatch.ElapsedTicks).ToString() & " " & datesList.Count & " Days"
End Sub
Public Function GetDayOfWeekDates(startDate As Date, endDate As Date, daysOfWeek As List(Of DayOfWeek)) As List(Of Date)
Dim liReturn As New List(Of Date)()
Dim currDay As Date = startDate
While currDay <= endDate
If daysOfWeek.Contains(currDay.Date.DayOfWeek) Then
liReturn.Add(currDay.Date)
End If
currDay = currDay.AddDays(1)
End While
Return liReturn
End Function
その結果、月、火、金の次の出力 (経過ティック数) が得られました。
Method 1 : 10650 - 157 Days
Method 2 : 4152 - 157 Days
Method 3 : 4084 - 157 Days
Method 4 : 179 - 157 Days
これはまた、私の方法とロジックが貧弱だったことを意味します。