Подтвердить что ты не робот

Даты для цикла в vb.net

В vb.net у меня есть два значения данных, как показано ниже:

Dim startp as datetime
Dim endp as datetime

У меня есть функция, называемая ProcessData(soemdate), которая обрабатывает dataporting.

В VB.net есть способ, которым я могу сделать что-то вроде

For each day between startp and endp
 ProcessData(soemdate)
Next 

Спасибо

4b9b3361

Ответ 1

Вот еще один способ сделать это.

Dim startP As DateTime = New DateTime(2009, 1, 1)
Dim endP As DateTime = New DateTime(2009, 2, 1)
Dim CurrD As DateTime = startP

While (CurrD <= endP)        
    ProcessData(CurrD)
    Console.WriteLine(CurrD.ToShortDateString)
    CurrD = CurrD.AddDays(1)
End While

Ответ 2

For Each Day As DateTime in Enumerable.Range(0, (endp - startp).Days) _
                            .Select(Function(i) startp.AddDays(i)) 
    ProcessData(Day)
Next Day

Ответ 3

Добавление к ответу Джоэля Коэхорна, который, как я лично считаю, должен быть принятым ответом, поскольку я всегда стараюсь избегать циклов, независимо от того, насколько они безопасны. Для... Каждый из них гораздо более безопасный, хотя перечислимый не очень красив в режиме онлайн. Тем не менее, вы можете переместить его в функцию, чтобы сделать вещи более читаемыми, а также вы можете повторно использовать по мере необходимости.

For Each Day As DateTime In DateRange(StartDate, EndDate)
    ProcessData(Day)
    Console.WriteLine(Day.ToShortDateString)
Next

Public Shared Function DateRange(Start As DateTime, Thru As DateTime) As IEnumerable(Of Date)
    Return Enumerable.Range(0, (Thru.Date - Start.Date).Days + 1).Select(Function(i) Start.AddDays(i))
End Function

Я также добавил 1 к диапазону Enumerable, поскольку, поскольку Joel имел его, он не вернул дату окончания, и в моей ситуации мне было нужно, чтобы он возвращал все даты в диапазоне, включая начальный и конечный дни.

Enumerable.Range - это своего рода цикл сам по себе, который добавляет я дней к старту, продвигающему я с каждым вызовом от этого 0 до разницы между начальным и конечным днями + 1. Таким образом, в первый раз, когда он называется, вы получаете результат Start.AddDays(0), затем вы получите Start.AddDays(1) и так далее, пока диапазон не будет завершен.

Ответ 4

Да, вы можете использовать дату аккумулятора:

Dim Accumulator as DateTime
Accumulator = startp

While (Accumulator <= endp)


    Accumulator = Accumulator.AddDays(1)
End While

Не тестировался, и я программист на С#, поэтому будьте спокойны, если мой синтаксис неверен.

Ответ 5

Установите таблицу календаря со всеми датами и значениями запроса оттуда.

SQL:

Select Date as MyDate from tblCalendar Where Date >= StartDt And Date <= EndDate

.NET:

While Reader.read
  process(MyDate)
End While