Листинг недели в данном месяце


Мне нужно принимать в течение месяца (определяется как начальная и конечная дата) и возвращает набор диапазонов дат для каждой недели в этом месяце. Неделя-это с воскресенья по субботу. Хороший способ визуализировать это, если вы дважды щелкните на Windows дата в старте:

enter image description here

В октябре месяце 2011 года 6 недель:

10/1-10/1

10/2-10/8

10/9-10/15

10/16-10/22

10/23-10/29

10/30-10/31

Я могу описать каждую неделю в виде struct:

   struct Range
   {
      public DateTime Start;
      public DateTime End;

      public Range(DateTime start, DateTime end)
      {
         Start = start;
         End = end;
      }
   }

Мне нужно написать функцию, которая берет в месяц и возвращает массив колеблется внутри него. Вот моя первая попытка, которая, кажется, работает и устраняет очевидные граничные случаи:

public static IEnumerable<Range> GetRange(DateTime start, DateTime end)
{
   DateTime curStart = start;
   DateTime curPtr = start;
   do
   {
      if (curPtr.DayOfWeek == DayOfWeek.Saturday)
      {
         yield return new Range(curStart, curPtr);
         curStart = curPtr.AddDays(1);
      }

      curPtr = curPtr.AddDays(1);
   } while (curPtr <= end);

   if(curStart <= end)
      yield return new Range(curStart, end);
}

Я хотел бы знать, если есть более чистого или более очевидный подход, чтобы сделать то же самое. Я не слишком беспокоится о производительности, но я хотел бы, чтобы улучшить читаемость кода и сделать алгоритм немного более кратким. Возможно, это очень креативное решение с участием одного выражения LINQ или что-то.



11731
13
задан 18 октября 2011 в 05:10 Источник Поделиться
Комментарии
1 ответ

Ну, во-первых свой ассортимент только для хранения даты начала, как недели всегда имеют одинаковую длину:

struct Range {

public DateTime Start { get; private set; }

public DateTime End { get { return Start.AddDays(6); } }

public Range(DateTime start) {
Start = start;
}

}

Начало недели может быть выполнена путем воскресеньям, начиная шесть дней в предыдущем месяце:

public static IEnumerable<Range> GetRange(int year, int month) {
DateTime start = new DateTime(year, month, 1).AddDays(-6);
DateTime end = new DateTime(year, month, 1).AddMonths(1).AddDays(-1);
for (DateTime date = start; date <= end; date = date.AddDays(1)) {
if (date.DayOfWeek == DayOfWeek.Sunday) {
yield return new Range(date);
}
}
}

Для уточнения: это возвращает целые недели, дней в месяце, а не частичное недели создается из дней в месяце, группируя их по тому, что неделю они принадлежат.

7
ответ дан 18 октября 2011 в 11:10 Источник Поделиться