2012-02-01 13 views
24

Eventuali duplicati:
How do I loop through a date range?giorno foreach nel mese

Esiste un modo per fare un ciclo foreach per ogni giorno in un mese specifico?

pensando a qualcosa di simile

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

Che cosa è necessario per ogni giorno? Hai bisogno di una data completa o semplicemente di un valore numerico per ogni giorno? – sll

+3

In realtà penso che sarebbe fantastico se DateTime restituisse un IEnumerable per un intervallo di date richiesto. – adelphus

+0

@sll Sto creando un calendario in cui è visibile l'intero anno e in cui le persone sarebbero in grado di prendere appunti su date singole –

risposta

55

è possibile scrivere un metodo di supporto abbastanza facilmente:

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); 
    } 
} 

Quindi chiamare con:

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

Questo è probabilmente eccessivo per som ething stai facendo solo una volta, ma è molto più bello che usare un ciclo for o qualcosa di simile se lo fai molto. Rende il tuo codice dire solo quello che vuoi ottenere, piuttosto che i meccanismi per come lo stai facendo.

+1

Ancora meglio sostituire le prime due righe di questa funzione con: foreach (var day in Enumerable.Range (1, DateTime.DaysInMonth (year, month)) – DamienG

+0

Mi sembra che questa domanda sia appena stata skeeted su – Joe

20

Provare a utilizzare un ciclo for, invece.

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

È possibile farlo con un semplice ciclo:

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

Mi piace usare la capacità spesso trascurata di utilizzare per i loop con tipi di dati diversi da int. –

13

È possibile utilizzare Gamma:

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 passo avanti ' Enumerable.Range (1, DateTime.DayInMonth (2012, 1)). Selezionare (giorno => nuovo DateTime (2012, 1, giorno)) ' – Ray

+0

@Ray, grazie! Ottima idea – Joe

+0

Mi piace questa risposta di più. – NibblyPig

5

è abbastanza facile da generare un'enumerazione di giorni. Ecco un modo per farlo

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