Я хочу сделать функцию, которая занимает месяц и год, и возвращает List<DateTime>
, заполненную всеми датами в этом месяце.
любая помощь будет оценена
Спасибо в Advance
Я хочу сделать функцию, которая занимает месяц и год, и возвращает List<DateTime>
, заполненную всеми датами в этом месяце.
любая помощь будет оценена
Спасибо в Advance
Здесь решение с 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
}
И один с циклом 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;
}
Возможно, вам захочется вернуться к потоковой последовательности дат вместо List<DateTime>
, позволяя вызывающему абоненту решить, следует ли загружать даты в список или массивы/обрабатывать их/частично перебирать их и т.д. Для версии LINQ, вы можете выполнить это, удалив вызов ToList()
. Для for-loop вы хотели бы реализовать iterator. В обоих случаях возвращаемый тип должен быть изменен на IEnumerable<DateTime>
.
Пример для версий Pre-Linq Framework с использованием в феврале 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);
Я уверен, что могут быть лучшие способы сделать это. Но вы можете использовать это:
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;
}
Здесь вы идете:
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;
}
Итерируется через даты с первого месяца, которое вы хотите до последней даты, которая меньше, чем первая из следующего месяца.
PS: Если это домашнее задание, отметьте его "домашним заданием"!