136 votes

Créez un tableau ou une liste de toutes les dates comprises entre deux dates.

Je génère des graphiques multi-séries avec la date sur l'axe des x.

Le problème est que toutes les séries du graphique n'ont pas les mêmes dates dans la plage de dates. Cela signifie que si je choisis la période du 1er février au 30 avril, une série peut avoir des données qui commencent le 1er février mais qui ne vont que jusqu'à la fin mars, alors qu'une autre série peut avoir des données pour toute la période.

Cela fausse les graphiques que je dois créer. Allez, étant donné la plage de dates prise au début de la requête, je voudrais générer une liste de dates et remplir les données à représenter, en remplissant ces séries avec des 0 pour les dates qui n'ont pas de données.

313voto

Ani Points 59747

LINQ :

Enumerable.Range(0, 1 + end.Subtract(start).Days)
          .Select(offset => start.AddDays(offset))
          .ToArray(); 

Pour la boucle :

var dates = new List<DateTime>();

for (var dt = start; dt <= end; dt = dt.AddDays(1))
{
   dates.Add(dt);
}

EDIT : Pour ce qui est du remplissage des valeurs par des valeurs par défaut dans une série temporelle, vous pourriez énumérer toutes les dates dans la plage de dates complète, et choisir la valeur pour une date directement dans la série si elle existe, ou la valeur par défaut sinon. Par exemple :

var paddedSeries = fullDates.ToDictionary(date => date, date => timeSeries.ContainsDate(date) 
                                               ? timeSeries[date] : defaultValue);

31voto

Anthony Pegram Points 58528
public static IEnumerable<DateTime> GetDateRange(DateTime startDate, DateTime endDate)
{
    if (endDate < startDate)
        throw new ArgumentException("endDate must be greater than or equal to startDate");

    while (startDate <= endDate)
    {
        yield return startDate;
        startDate = startDate.AddDays(1);
    }
}

25voto

Steve Adams Points 41

Je sais que c'est un vieux post mais essayez d'utiliser une méthode d'extension :

    public static IEnumerable<DateTime> Range(this DateTime startDate, DateTime endDate)
    {
        return Enumerable.Range(0, (endDate - startDate).Days + 1).Select(d => startDate.AddDays(d));
    }

et l'utiliser comme ceci

    var dates = new DateTime(2000, 1, 1).Range(new DateTime(2000, 1, 31));

N'hésitez pas à choisir vos propres dates, vous n'êtes pas obligé de vous limiter à janvier 2000.

4voto

Dan Diplo Points 16133

Notre maestro résident Jon Skeet a une grande Classe de gamme qui peut faire cela pour les DateTimes et d'autres types.

0voto

Abdu Points 45
list = list.Where(s => s.startDate >= Input_startDate && s.endDate <= Input_endDate);

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