Ni siquiera estoy seguro de cómo hacer esto sin usar alguna solución horrible para el tipo de bucle / contador. Aquí está el problema:
Me dan dos fechas, una fecha de inicio y una fecha de finalización y en un intervalo específico necesito tomar alguna medida. Por ejemplo: para cada fecha entre el 10/03/2009 y el tercer día hasta el 26/03/2009, necesito crear una entrada en una Lista. Entonces mis entradas serían:
DateTime StartDate = "3/10/2009";
DateTime EndDate = "3/26/2009";
int DayInterval = 3;
y mi salida sería una lista que tiene las siguientes fechas:
13/03/2009 16/03/2009 19/03/2009 22/03/2009 25/03/2009
Entonces, ¿cómo diablos haría algo como esto? Pensé en usar un bucle for que iteraría entre cada día en el rango con un contador separado como este:
int count = 0;
for(int i = 0; i < n; i++)
{
count++;
if(count >= DayInterval)
{
//take action
count = 0;
}
}
Pero parece que podría haber una mejor manera?
Respuestas:
Bueno, deberás recorrerlos de una forma u otra. Prefiero definir un método como este:
Entonces puedes usarlo así:
De esta manera, podría presionar cada dos días, cada tercer día, solo entre semana, etc. Por ejemplo, para regresar cada tercer día a partir de la fecha de "inicio", puede simplemente llamar
AddDays(3)
al bucle en lugar de hacerloAddDays(1)
.fuente
Tengo una
Range
clase en MiscUtil que puedes encontrar útil. En combinación con los diversos métodos de extensión, puede hacer:(Es posible que desee o no excluir el final, solo pensé en proporcionarlo como ejemplo).
Esto es básicamente una forma lista para usar (y de uso más general) de la solución de mquander.
fuente
ExcludeEnd()
es lindo.Para tu ejemplo puedes probar
fuente
Código de @mquander y @Yogurt The Wise utilizado en extensiones:
fuente
EachDayTo
yEachMonthTo
? Creo que me perdí algo aquí.fuente
1 año después, que pueda ayudar a alguien,
Esta versión incluye un predicado , para ser más flexible.
Uso
Diariamente a mi cumpleaños
Mensualmente para mi cumpleaños, paso 2 meses
Anual para mi cumpleaños
Utilizar en su
RangeFrom
lugarImplementación
Extras
Podría lanzar una excepción si el
fromDate > toDate
, pero prefiero devolver un rango vacío en su lugar[]
fuente
fuente
while
ejecuta.Según el problema, puedes probar esto ...
Gracias......
fuente
fuente
Puede considerar escribir un iterador en su lugar, lo que le permite usar la sintaxis de bucle 'for' normal como '++'. Busqué y encontré una pregunta similar respondida aquí en StackOverflow, que ofrece sugerencias para hacer que DateTime sea iterable.
fuente
Puede usar la
DateTime.AddDays()
función para agregar suDayInterval
alStartDate
y verificar para asegurarse de que sea menor que elEndDate
.fuente
debe tener cuidado aquí para no perder las fechas cuando en el bucle sería una mejor solución.
esto le da la primera fecha de inicio y la usa en el ciclo antes de incrementarla y procesará todas las fechas, incluida la última fecha de finalización, por lo tanto <= finalización.
entonces la respuesta anterior es la correcta.
fuente
Puedes usar esto.
fuente
Iterar cada 15 minutos
fuente
@ jacob-sobus y @mquander y @Yogurt no son exactamente correctos ... Si necesito al día siguiente, espero las 00:00 en su mayoría
fuente
Aquí están mis 2 centavos en 2020.
fuente