2013-05-29 5 views
3

Я пытаюсь отфильтровать календарь (список дат) по дневному номеру, но борюсь за конкретный сценарий!Отфильтровать список дат по дате

В календаре первоначально будут указаны все даты в указанном диапазоне, скажем, 31 января 2013 года - 31 января 2015 года. Я хотел бы отфильтровать этот список, чтобы содержать только даты, которые соответствуют числу первого дня в календаре, например, если первый день в календаре 25, новый фильтруется календарь вернулся бы:

  • 25 Февралю +2013
  • 25 марта 2013
  • 25 апреля 2013

.. И т.п.

Это первый пример достаточно просто с помощью LINQ

var calendar = ...code to get calendar from DB. 

//Get Day Number of First Entry in Calendar (31st for example) 
int day = calendar.Dates.Select(d => d.Date.Day).First(); 

//Filter the rest of the calendar by this date. 
return new Calendar 
{ 
    Dates = calendar.Dates.Where(c => c.Date.Day == day).ToList() 
}; 

я получаю в трудности при переходе, скажем, 31. Мое требование, так что это возвращается:

  • 31 Jan 2013
  • 28 февраля 2013
  • 30 апреля 2013
  • 31 мая 2013

... и т.д.

Какой самый лучший способ для достижения этой цели? Он клюет мой мозг в среду утром!

Я хотел бы, если это вообще возможно для ответа быть совершенным однострочник LINQ заявление :)

Большое спасибо,

Alex

+0

Можете ли вы предоставить год, который будет использоваться? –

+0

Итак, вы действительно не хотите, чтобы дата была днем ​​31, но в последний день любого месяца? Возможно, этот метод поможет: 'bool IsLastOfMonth (DateTime date) {return date == new DateTime (date.Year, date.Month, 1) .AddMonths (1) .AddDays (-1); } '(не тестировалось) – Corak

+0

. Отфильтрованный календарь, скорее всего, будет содержать диапазон дат, охватывающий 3-5 лет, скажем, 2012-2015 гг. со всеми датами между ними. Отвечает ли это на ваш вопрос? – Huntsman

ответ

1

DateTime.DaysInMonth на помощь!

return new Calendar 
{ 
Dates = calendar.Dates.Where(c => c.Date.Day == Math.Min(day, DateTime.DaysInMonth(c.Year, c.Month))).ToList() 
}; 
+0

Nice one - Я думаю, что это будет трюк !! – Huntsman

1
Dates = calendar.Dates.Where(c => c.Date.Day == Math.Min(day, DateTime.DaysInMonth(c.Year, c.Month))).ToList() 
+0

Он получает день, а затем он либо должен получить день с этим номером, либо если он слишком большой в последний день месяца. Почти там, но не совсем. -1. –

+0

Непонятно, вопрос сначала .. –

+0

Downvote reverted :) –

Смежные вопросы