Eu nem tenho certeza de como fazer isso sem usar uma solução horrível para loop / contador. Aqui está o problema:
Recebi duas datas, uma data de início e uma data de término e, em um intervalo especificado, preciso tomar alguma ação. Por exemplo: para cada data entre 10/03/2009 a cada três dias até 26/03/2009, preciso criar uma entrada em uma Lista. Então, minhas entradas seriam:
DateTime StartDate = "3/10/2009";
DateTime EndDate = "3/26/2009";
int DayInterval = 3;
e minha saída seria uma lista com as seguintes datas:
13/03/2009 3/16/2009 19/03/2009 22/03/2009 25/03/2009
Então, como diabos eu faria algo assim? Pensei em usar um loop for que iteraria entre todos os dias no intervalo com um contador separado da seguinte forma:
int count = 0;
for(int i = 0; i < n; i++)
{
count++;
if(count >= DayInterval)
{
//take action
count = 0;
}
}
Mas parece que poderia haver uma maneira melhor?
Respostas:
Bem, você precisará passar por eles de uma maneira ou de outra. Eu prefiro definir um método como este:
Então você pode usá-lo assim:
Dessa maneira, você pode pressionar todos os dias, a cada três dias, apenas dias da semana, etc. Por exemplo, para retornar a cada terceiro dia começando com a data de "início", basta chamar
AddDays(3)
o loop em vez deAddDays(1)
.fonte
Eu tenho uma
Range
aula no MiscUtil que você pode achar útil. Combinado com os vários métodos de extensão, você pode fazer:(Você pode ou não querer excluir o final - pensei em fornecer o exemplo.)
Essa é basicamente uma forma de solução pronta para o uso do mquander (e mais genérica).
fonte
ExcludeEnd()
é fofo.Para o seu exemplo, você pode tentar
fonte
Código de @mquander e @Yogurt The Wise usado em extensões:
fonte
EachDayTo
eEachMonthTo
? Eu acho que perdi alguma coisa aqui.fonte
1 ano depois, pode ajudar alguém,
Esta versão inclui um predicado , para ser mais flexível.
Uso
Diariamente ao meu aniversário
Mensalmente até meu aniversário, Etapa 2 meses
Anualmente ao meu aniversário
Use em
RangeFrom
vez dissoImplementação
Extras
Você pode lançar uma exceção se o
fromDate > toDate
, mas eu prefiro retornar um intervalo vazio[]
fonte
fonte
while
é executado.De acordo com o problema, você pode tentar isso ...
obrigado......
fonte
fonte
Você pode escrever um iterador, que permite usar a sintaxe normal do loop 'for' como '++'. Pesquisei e encontrei uma pergunta semelhante respondida aqui no StackOverflow, que fornece dicas sobre como tornar o DateTime iterável.
fonte
Você pode usar a
DateTime.AddDays()
função para adicionarDayInterval
aoStartDate
e verificar se ele é menor que oEndDate
.fonte
você deve ter cuidado aqui para não perder as datas em que, no circuito, seria uma solução melhor.
isso fornece a primeira data da data de início e a utiliza no loop antes de incrementá-la. Ele processará todas as datas, incluindo a última data da data final, portanto <= data final.
então a resposta acima é a correta.
fonte
Você pode usar isso.
fonte
Iterar a cada 15 minutos
fonte
@ jacob-sobus e @mquander e @yogurt não estão exatamente corretos .. Se eu precisar no dia seguinte, espero 00:00, na maior parte do tempo
fonte
Aqui estão meus 2 centavos em 2020.
fonte