Chcę utworzyć funkcję, która trwa miesiąc i rok, a następnie zwrócony List<DateTime>
wypełniony wszystkimi datami w tym miesiącu.Jak uzyskać wszystkie daty w danym miesiącu w języku C#
Każda pomoc będzie mile widziane
z góry dzięki
Chcę utworzyć funkcję, która trwa miesiąc i rok, a następnie zwrócony List<DateTime>
wypełniony wszystkimi datami w tym miesiącu.Jak uzyskać wszystkie daty w danym miesiącu w języku C#
Każda pomoc będzie mile widziane
z góry dzięki
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>
.
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;
}
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);
Przypuszczam, że "data. Miesiąc == 2" powinien być "data. Miesiąc == miesiąc" :) –
@lasseespeholt - dzięki, naprawiono –
Człowieku, to najlepsza odpowiedź, z którą się spotkałem nawet po 6 latach opublikowałeś to. Tak prosty, czytelny, dziękuję. – Kadaj
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"!
Och, podoba mi się wersja Linq. To miłe. Bardzo edukacyjne dla początkującej Linq, dziękuję. – Lunivore
@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