it-roy-ru.com

Как получить все даты за месяц в C #

Я хочу сделать функцию, которая принимает месяц и год и возвращает List<DateTime>, заполненную всеми датами в этом месяце.

любая помощь будет оценена

Заранее спасибо

27
Amira Elsayed Ismail

Вот решение с помощью 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
}

И один с циклом:

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 вы хотели бы реализовать итератор . В обоих случаях тип возвращаемого значения должен быть изменен на IEnumerable<DateTime>.

71
Ani

Пример для версий до 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);
5
Steve Townsend

Я уверен, что могут быть лучшие способы сделать это. Но вы можете использовать это:

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;
}
3
Pablo Santa Cruz

Ну вот:

    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: Если это домашнее задание, пожалуйста, пометьте его как «домашнее задание»!

0
Lunivore