Создайте массив или Список всех дат между двумя датами

Я создаю многосерийные графики с датой по оси Х.

Проблема заключается в том, что не все серии на графике имеют одинаковые даты в диапазоне дат. Это означает, что если я выберу с 1 февраля по 30 апреля, что у одной серии могут быть данные, которые начинаются с 1 февраля, а только до конца марта, а в другой серии могут быть данные для всего диапазона дат.

Это уменьшает диаграммы, которые мне нужно создать. Go, учитывая диапазон дат, принятый в начале запроса, я хотел бы сгенерировать список дат и заполнить данные, которые нужно графипировать, заполнив эти серии с помощью 0 для тех дат, у которых нет данных.

Ответ 1

LINQ:

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

Для цикла:

var dates = new List<DateTime>();

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

EDIT: Что касается значений дополнений со значениями по умолчанию в временном ряду, вы можете перечислить все даты в полном диапазоне дат и выбрать значение для даты непосредственно из серии, если оно существует, или по умолчанию в противном случае. Например:

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

Ответ 2

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);
    }
}

Ответ 3

Я знаю, что это старый пост, но попробуйте использовать метод расширения:

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

и используйте его так:

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

Не стесняйтесь выбирать свои собственные даты, вам не нужно ограничивать себя до января 2000 года.

Ответ 4

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

 

Ответ 5

Наш житель-маэстро Джон Скит имеет отличный Range Class, который может сделать это для DateTimes и других типов.