在vb.net中For循环的日期

12 vb.net foreach date

在vb.net中,我有两个数据值,如下所示:

Dim startp as datetime
Dim endp as datetime
Run Code Online (Sandbox Code Playgroud)

我有一个函数调用ProcessData(soemdate),它处理dataporting.

在VB.net中有一种我可以做的事情

For each day between startp and endp
 ProcessData(soemdate)
Next 
Run Code Online (Sandbox Code Playgroud)

谢谢

Joh*_*nFx 26

这是另一种方法.

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
Run Code Online (Sandbox Code Playgroud)


Joe*_*orn 18

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

  • enumerable.range方法的+1(很酷的技巧)-1对于任何需要支持它的目的有点混淆. (7认同)

Rya*_*hur 9

加入Joel Coehoorn的答案我个人认为应该是接受的答案,因为我总是尽量避免使用While循环而不管它们可能出现多么安全.对于...每个都是一个更安全的方法,虽然可枚举的内联不是很漂亮.但是,您可以将其移动到一个函数以使事物更具可读性,并且可以根据需要重新使用.

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
Run Code Online (Sandbox Code Playgroud)

我还在Enumerable系列中添加了1,因为Joel拥有它,它不会返回结束日期,在我的情况下我需要它返回范围内的所有日期,包括开始和结束日期.

Enumerable.Range本身就是一种循环,它将i天添加到startdate中,每次调用都会推进i,在这种情况下为0,开始日和结束日之间的差异为1.因此,第一次调用它时会得到Start的结果.AddDays(0),接下来你将获得Start.AddDays(1),依此类推,直到范围完成.