2009-08-26 15 views
12

En vb.net I tienen dos valores de datos como se muestra a continuación:Fechas en Para Loop en vb.net

Dim startp as datetime 
Dim endp as datetime 

I tienen una función llamada ProcessData(soemdate) que procesa dataporting.

En VB.net es que hay alguna manera de hacer algo como

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

Gracias

+0

Simplemente mis 2 centavos aquí, pero si su función realmente se llama "ProcessData", es posible que desee considerar algo un poco más descriptivo para el mantenimiento. Si ese fue solo el nombre de una función hipotética, ignore este comentario. – JohnFx

Respuesta

19

Aquí hay otra forma de hacerlo.

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 
+0

esa es la de aquí. –

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

+1 para el enfoque enumerable.range (truco genial) -1 por ser un poco ofuscado en cuanto al propósito para quien necesita apoyarlo. – JohnFx

+0

Disculpe la demora en la traducción de VB: algo surgió en el trabajo que priorizó mi atención. –

+0

Admito que el truco de Enumerable.Range parece raro la primera vez que lo ves, pero es una de esas cosas que, una vez que lo tienes, te preguntas por qué lo hiciste de otra manera. –

0

Sí, puede utilizar una fecha de acumulador:

Dim Accumulator as DateTime 
Accumulator = startp 

While (Accumulator <= endp) 


    Accumulator = Accumulator.AddDays(1) 
End While 

No se ha probado y soy programador de C#, así que será fácil si mi sintaxis es incorrecta.

-1

Establezca una tabla de calendario con todas las fechas y valores de consulta desde allí.

SQL:

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

.NET:

While Reader.read 
    process(MyDate) 
End While 
8

Agregando a la respuesta de Joel Coehoorn que personalmente creo que debería ser la respuesta aceptada como siempre trato de evitar mientras bucles no importa cuán seguros puede aparecer. Para ... Cada uno es un enfoque mucho más seguro, aunque el enumerable no es muy bonito en línea. Sin embargo, puede moverlo a una función para mantener las cosas más legibles, además de que puede reutilizar según sea necesario.

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 

También añade 1 al rango Enumerable ya que como Joel lo tenía, no volvería la fecha de finalización y en mi situación lo necesitaba para devolver todas las fechas del rango, incluyendo los días de inicio y fin.

Enumerable.Range es una especie de bucle en sí mismo que agrega i días a la fecha de inicio que avanza i con cada llamada de en este caso 0 a la diferencia entre días de inicio y final + 1. Así que la primera vez que se llama se obtiene el resultado de Start.AddDays (0), a continuación obtendrá Start.AddDays (1) y así sucesivamente hasta que se complete el rango.