2009-08-26 6 views
12

En vb.net j'ai deux valeurs de données comme indiqué ci-dessous:en boucle For en vb.net

Dim startp as datetime 
Dim endp as datetime 

j'ai une fonction appelée ProcessData(soemdate) qui traite dataporting.

En VB.net est-il un moyen que je peux faire quelque chose comme

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

Merci

+0

Juste mes 2 cents ici, mais si votre fonction est vraiment appelée "ProcessData" vous voudrez peut-être envisager quelque chose d'un peu plus descriptif pour la maintenabilité. Si ce n'était qu'un nom de fonction hypothétique, veuillez ignorer ce commentaire. – JohnFx

Répondre

19

Voici une autre façon de procéder.

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

c'est celui-là. –

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 pour l'approche enumerable.range (truc cool) -1 pour être un peu obscurcis quant à l'objectif de celui qui a besoin de le supporter. – JohnFx

+0

Désolé pour le retard sur la traduction VB - quelque chose est venu au travail qui a eu la priorité sur mon attention. –

+0

J'avoue que l'astuce Enumerable.Range a l'air bizarre la première fois que vous voyez, mais c'est une de ces choses qu'une fois que vous l'obtenez, vous vous demandez pourquoi vous l'avez déjà fait d'une autre manière. –

0

Oui, vous pouvez utiliser une date d'accumulateur:

Dim Accumulator as DateTime 
Accumulator = startp 

While (Accumulator <= endp) 


    Accumulator = Accumulator.AddDays(1) 
End While 

Non testé , et je suis un programmeur C#, alors sois facile si ma syntaxe est fausse.

-1

Définissez une table de calendrier avec toutes les dates et les valeurs de requête à partir de là.

SQL:

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

.NET:

While Reader.read 
    process(MyDate) 
End While 
8

Ajout à la réponse de Joel Coehoorn que je pense personnellement devrait être la réponse acceptée comme je l'essaie toujours d'éviter les boucles While, peu importe le degré de sécurité qu'ils peut apparaître. Pour ... Chacun est une approche beaucoup plus sûre bien que l'énumérable n'est pas très joli en ligne. Vous pouvez cependant le déplacer vers une fonction pour garder les choses plus lisibles, et vous pouvez réutiliser au besoin.

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 

J'ai également ajouté 1 à la gamme Enumerable depuis que Joel avait, il ne retournerait pas la date de fin et dans ma situation je en avais besoin de retourner toutes les dates de la gamme, y compris les jours de début et de fin. Enumerable.Range est une sorte de boucle en elle-même qui ajoute i jours au startdate en avançant i avec chaque appel de 0 dans ce cas à la différence entre les jours de début et de fin + 1. Ainsi, la première fois que vous l'appelez le résultat de Start.AddDays (0), vous obtiendrez Start.AddDays (1) et ainsi de suite jusqu'à ce que la plage soit complète.

Questions connexes