web-dev-qa-db-fra.com

Créer un tableau ou une liste de toutes les dates entre deux dates

Je génère des graphiques multi-séries avec la date le long de l'axe des abscisses.

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

Cela déforme les graphiques que je dois créer. Allez, étant donné la plage de dates prise au début de la requête, j'aimerais générer une liste de dates et renseigner les données à représenter, en complétant ces séries avec des 0 pour les dates sans données.

126
Andy Evans

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: comme pour les valeurs de remplissage avec des valeurs par défaut dans une série chronologique, vous pouvez énumérer toutes les dates de la plage de dates complète et choisir la valeur d’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);
291
Ani
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);
    }
}
30
Anthony Pegram

Je sais que c'est un ancien 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 ça

    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.

25
Steve Adams

Notre maître résident Jon Skeet a un grand Range Class qui peut le faire pour DateTimes et d'autres types.

4
Dan Diplo
list = list.Where(s => s.startDate >= Input_startDate && s.endDate <= Input_endDate);

1
lici abdu