35 votes

Comment parcourez-vous chaque jour de l'année?

Étant donné une date de début du 1/1/2009 et une date de fin du 31/12/2009, comment puis-je parcourir chaque date et récupérer une valeur DateTime à l'aide de c #?

Merci!

78voto

Stuart Branham Points 4216

J'utiliserais une boucle qui ressemble à ceci

 for(DateTime date = begin; date <= end; date = date.AddDays(1))
{
}
 

Définissez le début et la fin en conséquence

20voto

OscarRyz Points 82553

Une autre option de la mise en œuvre de l'Itérateur modèle de conception:

Cela peut sembler inutile, mais j'en fonction de comment vous utilisez cette fonctionnalité, vous pouvez également implémenter le design pattern Iterator.

Pense que sur ce. Supposons que tout fonctionne bien, et vous le copier/coller de tous sur la place, le "pour" de la phrase. Et soudain, dans le cadre des exigences, vous devez effectuer une itération tous les jours, mais ignorer certains d'entre eux ( comme dans le calendrier, ignorez les vacances, week-ends, personnalisée, etc )

Vous devez créer un nouveau "ciselée" et utilisez le Calendrier à la place. Ensuite, la recherche et le remplacement de vos pour de.

En programmation orientée objet, ce qui pourrait être réalisé à l'aide de l'Itérateur modèle.

De Wikpedia:

En programmation orientée objet, l'Itérateur modèle est un modèle de conception dans laquelle les itérateurs sont utilisés pour accéder aux éléments d'un ensemble d'objets de manière séquentielle , sans exposer sa représentation sous-jacente. Un Itérateur objet encapsule la structure interne de la façon dont l'itération se produit.

L'idée est donc d'utiliser une construction comme ceci:

        DateTime fromDate = DateTime.Parse("1/1/2009");
        DateTime toDate   = DateTime.Parse("12/31/2009");

        // Create an instance of the collection class
        DateTimeEnumerator dateTimeRange = 
                              new DateTimeEnumerator( fromDate, toDate );


        // Iterate with foreach
        foreach (DateTime day in dateTimeRange )
        {
            System.Console.Write(day + " ");
        }

Et puis, si nécessaire, vous pouvez créer des sous-classes pour mettre en œuvre des algorithmes différents, l'un qui utilise AddDay(1), autres que les utilisations AddDay( 7 ) ou d'autres que de simples utilise le Calendrier à la place. Etc. etc.

L'idée est de réduire le couplage entre les objets.

Encore une fois, ce serait trop pour la plupart des cas, mais si l'itération formes pertinentes de la partie d'un système ( disons , vous créez une sorte quelle que soit la notification, pour une entreprise, et doit correspondre aux mondialisations

La mise en œuvre de base bien sûr, serait d'utiliser la pour.

public class DateTimeEnumerator : System.Collections.IEnumerable
{
    private DateTime begin;
    private DateTime end;

    public DateTimeEnumerator ( DateTime begin , DateTime end ) 
    {
        // probably create a defensive copy here... 
        this.begin = begin;
        this.end = end;
    }
    public System.Collections.IEnumerator GetEnumerator()
    {
        for(DateTime date = begin; date < end; date = date.AddDays(1))
        {
            yield return date;
        }
    }
}

Juste une idée :)

6voto

Kevin Points 57797
DateTime dateTime = new DateTime(2009, 1, 1);    

while(dateTime.Year < 2010)
    {

      dateTime = dateTime.AddDays(1);
    }

5voto

Jon Skeet Points 692016

J'utiliserais MiscUtil et ses méthodes d'extension:

 foreach(DateTime date in 1.January(2009)
                         .To(31.December(2009))
                         .Step(1.Days())
{
    Console.WriteLine(date);
}
 

3voto

Jon Points 7497

Définissez deux variables:

 DateTime lowValue = DateTime.Parse("1/1/2009");
DateTime highValue = DateTime.Parse("12/31/2009");
 

Ensuite, ajoutez un jour à la valeur faible jusqu'à ce qu'elle soit égale à la valeur élevée:

 while (lowValue <= highValue)
{
   //Do stuff here
   lowValue = lowValue.AddDays(1);
}
 

Ou quelque chose comme ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X