2011-10-20 1 views
1

Je rencontre quelques problèmes lors de la tentative de configuration d'un sous-programme dans Visual Basic .NET pour parcourir une série d'enregistrements et supprimer tous les enregistrements où le champ de date est avant la date actuelle. Voici mon code actuel:Problèmes de gestion de groupe de dates VB.NET

Sub FutureDate() 
     Dim movefrom As Integer 
     For x As Integer = 0 To UBound(notifications) 

      If notifications(x).MeetingTime < Now.Date Then 'Finds first current/future date. 
       movefrom = x 
      End If 
     Next 
     Dim moveto As Integer = 0 
     For x As Integer = movefrom To UBound(notifications) 'Moves dates after this to beginning of array. 
      movefrom += 1 
      notifications(moveto) = notifications(movefrom) 
      moveto += 1 
     Next 
     ReDim Preserve notifications(moveto) 'Shortens the array to the correct length. 
    End Sub 

Après ce sous est appelé, le programme montre les trois premiers enregistrements dans le tableau dans des boîtes de message (à des fins de débogage). Cependant, lorsque j'exécute le programme, les boîtes de message ne sont jamais affichées. Ce sous-problème est définitivement le problème, en commentant la ligne qui l'appelle résout le problème, et les messages appropriés apparaissent, mais avec la première boîte contenant une date dans le passé. C'est pour un système de notifications/réunions à venir, donc je ne veux évidemment pas inclure les dates qui ont passé. Les enregistrements sont déjà triés par date, donc à mes yeux, cela devrait faire ce que je veux, c'est-à-dire supprimer les enregistrements avec des dates dans le passé, déplacer tout le reste vers l'avant du tableau, puis retirer le espaces à la fin desquels les enregistrements ont été déplacés. Cependant, je fais souvent des erreurs stupides avec des choses comme ça, donc la contribution extérieure est très appréciée. Toute aide que vous pouvez donner serait géniale.

Merci.

+0

avez-vous essayé d'utiliser linq? Je pense que ce que vous essayez d'accomplir pourrait être plus facilement fait en utilisant linq. –

+0

Ah merci, je n'ai même jamais envisagé cette option. Cela rendra les choses beaucoup plus simples. – Aaron

+0

Les expressions lambda sont géniales. – Yatrix

Répondre

1

C'est un one-liner:

Sub FutureDate() 
    notifications = notifications.Where(Function(n) n.MeetingTime < Today).ToArray() 
End Sub 

Mais une meilleure conception est de construire une fonction qui rendement le nouveau tableau:

Function FutureDate(ByVal items() As MyType) As MyType() 
    Return items.Where(Function(n) n.MeetingTime < Today).ToArray() 
End Function 

Et encore mieux est de penser à termes de séquences plutôt que des tableaux:

Function FutureDate(ByVal items As IEnumerable(Of MyType)) As IEnumerable(Of MyType) 
    Return items.Where(Function(n) n.MeetingTime < Today) 
End Function 
+0

aime l'avatar, l'homme. Freeman 4 vie. – Yatrix

0
DateTime[] futureDates = notifications.Where(n => n.MeetingTime > DateTime.Now).Select(n => n.MeetingTime).ToArray(); 

Cela devrait fonctionner, je pense. Sinon, c'est très similaire. Cela devrait renvoyer uniquement les dates des réunions qui sont postérieures à maintenant.

Espérons que cela aide.