2012-02-01 12 views
24

Duplicar posibles:
How do I loop through a date range?día foreach en el mes

¿Hay una manera de hacer un bucle foreach para cada día en un mes específico?

pensar en algo así como

foreach (DateTime date in DateTime.DaysInMonth(2012, 1)) 
{ 
} 
+0

¿Qué necesita para cada día? ¿Necesita una fecha completa o solo un valor numérico por cada día? – sll

+3

De hecho, creo que sería genial si DateTime devolviera un IEnumerable para un intervalo de fechas solicitado. – adelphus

+0

@sll Estoy haciendo un calendario donde todo el año es visible, y donde la gente podría tomar notas en fechas únicas –

Respuesta

55

puede escribir un método de ayuda con bastante facilidad:

public static IEnumerable<DateTime> AllDatesInMonth(int year, int month) 
{ 
    int days = DateTime.DaysInMonth(year, month); 
    for (int day = 1; day <= days; day++) 
    { 
     yield return new DateTime(year, month, day); 
    } 
} 

A continuación, llame con:

foreach (DateTime date in AllDatesInMonth(2012, 1)) 

Esto es probablemente demasiado para som Todo lo que está haciendo una vez, pero es mucho mejor que usar un bucle for o algo similar si está haciendo esto mucho. Hace que su código diga solo lo que quiere lograr, en lugar de la mecánica de cómo lo está haciendo.

+1

Mejor aún, reemplace las primeras dos líneas de esta función con: foreach (var day en Enumerable.Range (1, DateTime.DaysInMonth (year, month)) – DamienG

+0

Siento que esta pregunta acaba de ser Skeeted over. – Joe

20

Intente utilizar un bucle en su lugar.

for (int i = 1; i <= DateTime.DaysInMonth(year, month); i++) 
{ 
    DateTime dt = new DateTime(year, month, i); 
} 
10

Puede hacerlo con un bucle simple:

DateTime first = new DateTime(2012, 1, 1); 
for (DateTime current = first ; current.Month == first.Month ; current = current.AddDays(1)) { 
} 
+0

Me encanta hacer uso de la capacidad a menudo descuidada de utilizar para bucles con tipos de datos distintos de int. –

13

se pueden usar van:

Enumerable 
    .Range(1, DateTime.DayInMonth(2012, 1) 
    .Select(i => new DateTime(2012, 1, i))) 
    .ToList() // ForEach is not a Linq to Sql method (thanks @Markus Jarderot) 
    .ForEach(day => Console.Write(day)); 
+3

O un paso más adelante ' Enumerable.Range (1, DateTime.DayInMonth (2012, 1)). Seleccione (día => nuevo DateTime (2012, 1, día)) ' – Ray

+0

@Ray, gracias! Gran idea – Joe

+0

Me gusta esta respuesta al máximo. – NibblyPig

5

Es bastante fácil de generar una enumeración de días. Aquí hay una forma de hacerlo:

Enumerable.Range(1, DateTime.DaysInMonth(year, month)).Select(day => 
    new DateTime(year, month, day)) 
Cuestiones relacionadas