Подтвердить что ты не робот

Как получить все даты между двумя конкретными датами в С#

Я пытаюсь добавить все даты между двумя указанными датами. Вместо девяти разных дат я получаю 875287 и, очевидно, также получаю исключение из памяти из памяти. Где ошибка в этом коде?

StartDate Значение 01/04/2016 00:00:00

EndDate Значение 10/04/2016 00:00:00

var selectedDates = new List<DateTime?>();
for (var date = StartDate; date <= EndDate; date.Value.AddDays(1))
{
    selectedDates.Add(date);
}
4b9b3361

Ответ 1

Вы не присваиваете значение date.Value.AddDays(1) чему-либо, поэтому оно заканчивается бесконечным циклом. Вам нужно будет изменить код, чтобы date был установлен на результат AddDays.

for (var date = StartDate; date <= EndDate; date = date.AddDays(1))
{
    selectedDates.Add(date);
}

Ответ 2

решение LINQ (пусть сгенерирует selectedDates):

  var selectedDates = Enumerable
    .Range(0, int.MaxValue)
    .Select(index => new DateTime?(StartDate.AddDays(index)))
    .TakeWhile(date => date <= EndDate)
    .ToList();

Ответ 3

Насколько я вижу, поскольку AddDays метод возвращает новый экземпляр DateTime, он не изменяет текущий экземпляр, поскольку DateTime immutable.

Похоже, что ваш date равен DateTime?, вы можете изменить эту часть как:

for (var date = StartDate; date <= EndDate; date = date.Value.AddDays(1))
{
    selectedDates.Add(date);
}

Как указано в USR, это может повлиять на DST. Возможно, вы захотите проверить ответ Дмитрия.

Ответ 4

Более короткая нотация с использованием метода Linq Range использует возможность уже определить количество дней, используя свойство TimeSpan.Days после вычитания начала с конца.

Предполагая, что начало до конца, вы закончите:

DateTime StartDate = new DateTime(1979, 10, 4);
DateTime EndDate = new DateTime(2016, 10, 4);

var dates = Enumerable.Range(0, (EndDate - StartDate).Days + 1)
    .Select(day => StartDate.AddDays(day))

Если вам нужно, чтобы он был Nullable, добавьте:

    .Cast<DateTime?>()

Если вам нужно, чтобы это был список, добавьте:

    .ToList()

Это, вероятно, немного более эффективно, чем другое решение на базе LINQ.

Ответ 5

Решено изменить его с помощью do/while

var selectedDates = new List<DateTime?>();
DateTime? StartDate = DateTime.Parse("01/04/2016 00:00:00");
DateTime? EndDate = DateTime.Parse("10/04/2016 00:00:00");

do
{
    selectedDates.Add(StartDate);
    StartDate = StartDate.Value.AddDays(1);
}while(StartDate < EndDate);