Я даже не уверен, как это сделать, не используя какое-то ужасное решение для цикла / счетчика. Вот проблема:
Мне дают две даты, дату начала и дату окончания, и по указанному интервалу мне нужно предпринять некоторые действия. Например: для каждой даты с 3 октября 2009 года по третий день до 26 марта 2009 года мне нужно создать запись в списке. Так что мой вклад будет:
DateTime StartDate = "3/10/2009";
DateTime EndDate = "3/26/2009";
int DayInterval = 3;
и мой вывод будет список, который имеет следующие даты:
13.03.2009 16.03.2009 19.03.2009 22.03.2009 25.03.2009
Так как, черт возьми, я бы сделал что-то подобное? Я подумал об использовании цикла for, который будет перебирать каждый день в диапазоне с отдельным счетчиком следующим образом:
int count = 0;
for(int i = 0; i < n; i++)
{
count++;
if(count >= DayInterval)
{
//take action
count = 0;
}
}
Но кажется, что может быть лучше?
Ответы:
Ну, вам нужно перебрать их так или иначе. Я предпочитаю определять такой метод:
Тогда вы можете использовать это так:
Таким образом, вы можете нажимать каждый второй день, каждый третий день, только рабочие дни и т. Д. Например, чтобы возвращать каждый третий день, начиная с даты «начала», вы можете просто вызвать
AddDays(3)
цикл вместоAddDays(1)
.источник
У меня есть
Range
класс в MiscUtil, который вы можете найти полезным. В сочетании с различными методами расширения вы можете сделать:(Вы можете или не хотите исключать конец - я просто подумал, что приведу это в качестве примера.)
Это в основном готовая (и более универсальная) форма решения mquander.
источник
ExcludeEnd()
милый.Для вашего примера вы можете попробовать
источник
Код из @mquander и @Yogurt The Wise, используемый в расширениях:
источник
EachDayTo
аEachMonthTo
? Я думаю, что что-то здесь упустил.источник
1 год спустя, может это кому-нибудь помочь,
Эта версия включает в себя предикат , чтобы быть более гибким.
использование
Ежедневно до моего дня рождения
Ежемесячно до моего дня рождения, Шаг 2 месяца
Ежегодно до моего дня рождения
Используйте
RangeFrom
вместоРеализация
Дополнительно
Вы можете создать исключение, если
fromDate > toDate
, но я предпочитаю вместо этого возвращать пустой диапазон[]
источник
источник
while
.В зависимости от проблемы вы можете попробовать это ...
Спасибо......
источник
источник
Вы можете вместо этого написать итератор, который позволит вам использовать обычный синтаксис цикла for, например «++». Я искал и нашел похожий вопрос, на который ответили здесь, на StackOverflow, который дает указатели на то, чтобы сделать DateTime итеративным.
источник
Вы можете использовать
DateTime.AddDays()
функцию , чтобы добавить свойDayInterval
кStartDate
и проверьте , чтобы убедиться сделать это меньшеEndDate
.источник
Вы должны быть осторожны, чтобы не пропустить даты, когда в цикле будет лучшее решение.
это дает вам первую дату начальной даты и использует ее в цикле перед ее увеличением, и она обработает все даты, включая последнюю дату конечной даты, следовательно, <= enddate.
поэтому приведенный выше ответ является правильным.
источник
Вы можете использовать это.
источник
Повторяйте каждые 15 минут
источник
@ jacob-sobus, @mquander и @Yogurt не совсем верны. Если мне понадобится следующий день, я в основном жду 00:00.
источник
Вот мои 2 цента в 2020 году.
источник