2010-10-03 9 views

Respuesta

62

Aquí es una solución con LINQ:

public static List<DateTime> GetDates(int year, int month) 
{ 
    return Enumerable.Range(1, DateTime.DaysInMonth(year, month)) // Days: 1, 2 ... 31 etc. 
        .Select(day => new DateTime(year, month, day)) // Map each day to a date 
        .ToList(); // Load dates into a list 
} 

y otro con un ciclo for:

public static List<DateTime> GetDates(int year, int month) 
{ 
    var dates = new List<DateTime>(); 

    // Loop from the first day of the month until we hit the next month, moving forward a day at a time 
    for (var date = new DateTime(year, month, 1); date.Month == month; date = date.AddDays(1)) 
    { 
     dates.Add(date);  
    } 

    return dates; 
} 

Es posible que desee considerar el retorno de una de streaming secuencia de fechas en lugar de List<DateTime>, permitiendo que la persona que llama decida si cargar las fechas en una lista o matriz/postprocesarlas/iterarlas parcialmente, etc. Para la versión de LINQ, puede lograr esto mediante eliminando la llamada al ToList(). Para el for-loop, querrá implementar un iterator. En ambos casos, el tipo de devolución debería cambiarse a IEnumerable<DateTime>.

+2

Oh, me gusta la versión de Linq. Eso es bueno. Muy educativo para un novato Linq, gracias. – Lunivore

+0

@Ani Gran respuesta. ¿Hay alguna manera de usar la sintaxis de Linq para obtener un rango de fechas, por ejemplo, desde el primero de un mes hasta una fecha específica? es decir. Fechas del 1 de junio -> 20 de junio. – Josh

3

Estoy seguro de que puede haber mejores maneras de hacer esto. Sin embargo, se puede usar esto:

public List<DateTime> getAllDates(int year, int month) 
{ 
    var ret = new List<DateTime>(); 
    for (int i=1; i<=DateTime.DaysInMonth(year,month); i++) { 
     ret.Add(new DateTime(year, month, i)); 
    } 
    return ret; 
} 
5

muestra para pre-Linq versiones marco, usando febrero de 1999.

int year = 1999; 
int month = 2; 

List<DateTime> list = new List<DateTime>(); 
DateTime date = new DateTime(year, month, 1); 

do 
{ 
    list.Add(date); 
    date = date.AddDays(1); 
while (date.Month == month); 
+0

Supongo que 'date.Month == 2' debería haber sido' date.Month == month' :) –

+0

@lasseespeholt - gracias, fijo –

+0

Hombre, esta es la mejor respuesta que encontré incluso después de 6 años, publicaste esto. Tan simple, tan legible, gracias. – Kadaj

0

Aquí van:

public List<DateTime> AllDatesInAMonth(int month, int year) 
    { 
     var firstOftargetMonth = new DateTime(year, month, 1); 
     var firstOfNextMonth = firstOftargetMonth.AddMonths(1); 

     var allDates = new List<DateTime>(); 

     for (DateTime date = firstOftargetMonth; date < firstOfNextMonth; date = date.AddDays(1)) 
     { 
      allDates.Add(date); 
     } 

     return allDates; 
    } 

itera a través de las fechas desde el primer día del mes que desea a través de la última fecha que es menor que la primera del mes siguiente.

PD: ¡Si esto es tarea, por favor márquelo con "tarea"!

Cuestiones relacionadas