Помогите пожалуйста не могу составить правильный Linq запрос.
имееться к примеру такая колекция расписаний.
Class Shedule{
DateTime StartAt;
DateTime EndAt;
String ActualOnDays;
}
List<Shedule> Schedules = List<Shedule>();
Schedules.Add(
{
StartAt = "01/01/0001 9:30:00 AM",
EndAt = "01/01/0001 7:30:00 PM",
ActualOnDays = "MonTueWed"
}
);
Нужен запрос, который проверит есть ли в списке расписание в диапазон которого входит DateTime.Now То есть попросту говоря нужно проверить, актуален ли список расписаний прямо сейчас.
Обратите внимание, что используеться буржуйский формат. То есть надо учитывать AM-PM.
Ничего в голову кроме вот такого не приходит
DateTime now = DateTime.Now;
var q = from sc in Schedules
where
sc.ActualOnDays.Contains(now.ToString("ddd")) &
(now.Hour >= sc.StartAt.Hour && now.Hour<=sc.EndAt.Hour) &
(now.Minute >= sc.StartAt.Minute && now.Minute <= sc.EndAt.Minute) &
(now.Second >= sc.StartAt.Second && now.Second <= sc.EndAt.Second)
select sc;
Как-то громоздко выглядит.
Правда не проверял еще. По идее должно работать.
Здравствуйте, PlotNick.lj, Вы писали:
PL>Помогите пожалуйста не могу составить правильный Linq запрос.
PL>имееться к примеру такая колекция расписаний.
PL>Class Shedule{
PL> DateTime StartAt;
PL> DateTime EndAt;
PL> String ActualOnDays;
PL>}
Правильно ли понял, что по собственно дате дате фильтруется только ActualOnDays, а по StartAt\EndAt — время?
PL>Обратите внимание, что используеться буржуйский формат. То есть надо учитывать AM-PM.
А это тут причём?
Здравствуйте, PlotNick.lj, Вы писали:
PL>Как-то громоздко выглядит.
PL>Правда не проверял еще. По идее должно работать.
Тогда уж
DateTime now = DateTime.Now;
var q = from sc in Schedules
let day = now.ToString("ddd")
where sc.ActualOnDays.Contains(day)
&& now >= sc.StartAt && now <= sc.EndAt
select sc;
PL>Нужен запрос, который проверит есть ли в списке расписание в диапазон которого входит DateTime.Now То есть попросту говоря нужно проверить, актуален ли список расписаний прямо сейчас.
PL>Обратите внимание, что используеться буржуйский формат. То есть надо учитывать AM-PM.
Свои изменения выделил жирным.
class Shedule{
DateTime StartAt; // Если используется только time, то лучше юзать TimeSpan
DateTime EndAt;
String ActualOnDays;
bool Within(DateTime time) { return StartAt.TimeOfDay < time.TimeOfDay && time.TimeOfDay < EndAt.TimeOfDay; }
}
List<Shedule> Schedules = List<Shedule>();
Schedules.Add(
new Shedule
{
StartAt = "01/01/0001 9:30:00 AM",
EndAt = "01/01/0001 7:30:00 PM",
ActualOnDays = "MonTueWed"
}
);
var now = DateTime.Now;
var actual = Schedules.Where(s => s.Within(now));