2010-10-03 17 views

Odpowiedz

62

Oto rozwiązanie z 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 
} 

I jeden z za pętli:

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

Czasami warto rozważyć powrót do strumieniowego sekwencja dat zamiast List<DateTime>, pozwalająca dzwoniącemu zdecydować, czy wczytać daty do listy lub tablicy/post-processować je/częściowo iterować itd. Dla wersji LINQ można to osiągnąć przez usunięcie połączenia z ToList(). W przypadku pętli for, chcesz zaimplementować iterator. W obu przypadkach typ zwrotu musiałby zostać zmieniony na IEnumerable<DateTime>.

+2

Och, podoba mi się wersja Linq. To miłe. Bardzo edukacyjne dla początkującej Linq, dziękuję. – Lunivore

+0

@Ani Świetna odpowiedź. Czy istnieje sposób użycia składni Linq, aby uzyskać zakres dat, np. Od pierwszego dnia miesiąca do określonej daty? tj. Daty od 1 czerwca do 20 czerwca. – Josh

3

Jestem pewien, że może być lepsze sposoby, aby to zrobić. Ale można użyć tego:

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

próbki do wstępnego LINQ wersjach Ramowych, używając luty 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

Przypuszczam, że "data. Miesiąc == 2" powinien być "data. Miesiąc == miesiąc" :) –

+0

@lasseespeholt - dzięki, naprawiono –

+0

Człowieku, to najlepsza odpowiedź, z którą się spotkałem nawet po 6 latach opublikowałeś to. Tak prosty, czytelny, dziękuję. – Kadaj

0

Proszę bardzo:

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

iteracji dniach od pierwszego dnia miesiąca, który chcesz aż do ostatniego data jest mniejsza niż pierwszego dnia następnego miesiąca.

PS: Jeśli jest to zadanie domowe, oznacz je jako "zadanie domowe"!

Powiązane problemy