Crea un array o Elenco di tutte le date tra due date

Sto generando grafici multi-serie con la data lungo l’asse X.

Il problema è che non tutte le serie nel grafico hanno le stesse date nell’intervallo di date. Significando che se scelgo 1 febbraio fino al 30 aprile, una serie potrebbe avere dati che iniziano al 1 ° febbraio ma passeranno solo fino alla fine di marzo, ma un’altra serie potrebbe contenere dati per l’intero intervallo di date.

Ciò altera le tabelle che ho bisogno di creare. Vai, dato l’intervallo di date preso all’inizio della query mi piacerebbe generare un elenco di date e popolare i dati da graficare, riempire quelle serie con 0 per quelle date che non hanno dati.

LINQ:

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

Per ciclo:

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

MODIFICA: come per i valori di riempimento con valori predefiniti in una serie temporale, è ansible enumerare tutte le date nell'intero intervallo di date e selezionare il valore per una data direttamente dalla serie, se esistente, o altrimenti il ​​valore predefinito. Per esempio:

 var paddedSeries = fullDates.ToDictionary(date => date, date => timeSeries.ContainsDate(date) ? timeSeries[date] : defaultValue); 
 public static IEnumerable 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); } } 

So che questo è un vecchio post ma prova a utilizzare un metodo di estensione:

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

e usalo in questo modo

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

Sentiti libero di scegliere le tue date, non devi limitarti a gennaio 2000.

Il nostro maestro residente Jon Skeet ha una grande class di Range che può fare questo per DateTimes e altri tipi.

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