var evList = from e in events >>>>>>> where e.StartDate <= end && e.StartDate.AddDays( e.RecurrenceDays ) >= start >>>>>>> select e;>>>>>>>
var evList = events.Where( e => e.StartDate <= end && e.StartDate.AddDays( e.RecurrenceDays ) >= start);>>>>>>>
var evList = events.Where( e => e.WithIn( start, end ));>>>>>>>
>void Main() >{ > DateTime start = new DateTime(2000,1,1); > DateTime end = new DateTime(2000,2,28); > > // single event > Console.WriteLine ("\nSingle event"); > RecurringEvent evt = new RecurringEvent{ ID=1, StartDate=new DateTime(2000,1,15), RecurrenceDays=10 }; > SampleWithSingleEvent(evt,start,end); > > // list of events > Console.WriteLine ("\nList of events"); > List<RecurringEvent> evtList = > new List<RecurringEvent> { > new RecurringEvent{ ID=1, StartDate=new DateTime(2005,1,1), RecurrenceDays=10 }, > new RecurringEvent{ ID=2, StartDate=new DateTime(2000,1,1), RecurrenceDays=10 }, > new RecurringEvent{ ID=3, StartDate=new DateTime(2000,1,1), RecurrenceDays=5 }, > new RecurringEvent{ ID=4, StartDate=new DateTime(2000,1,1), RecurrenceDays=20 }, > new RecurringEvent{ ID=5, StartDate=new DateTime(2005,1,1), RecurrenceDays=5 }, > }; > SampleWithEventList(evtList,start,end); >} > >private static void SampleWithEventList(List<RecurringEvent> evtList, DateTime start, DateTime end) >{ > int days = (new int[] {(end-evtList.Min (l => l.StartDate)).Days,0}).Max(); > > var evtDays = from d in Enumerable.Range(0, days) > from e in evtList > let evtDate = e.StartDate.AddDays(d*e.RecurrenceDays) > where evtDate >= start && evtDate <= end > group evtDate by e into evtGroup > select evtGroup; // events grouped with a list of matching dates > > var occurList = evtDays.Select (d => d.Key); // only events > > bool occursBetween = (evtDays.Count() > 0); > if (occursBetween) { > foreach (var theEventGroup in evtDays) > { > ListDates(theEventGroup.Key, theEventGroup); > } > } > else { > Console.WriteLine ("None of these events occur within given date range:"); > foreach (var e in evtList) > { > Console.WriteLine ("\tEvent {0} with startdate {1} Recurrence Days {2}", > e.ID, > e.StartDate, > e.RecurrenceDays); > } > } > >} > >private static void SampleWithSingleEvent(RecurringEvent e,DateTime start, DateTime end) >{ > int days = (new int[] {(end-e.StartDate).Days,0}).Max(); > > var evtDays = from d in Enumerable.Range(0, days) > let evtDate = e.StartDate.AddDays(d*e.RecurrenceDays) > where evtDate >= start && evtDate <= end > select evtDate; // list of matching dates > > bool occursBetween = (evtDays.Count() > 0); > if (occursBetween) { > ListDates(e, evtDays); > } > else { > Console.WriteLine ("Event {0} with startdate {1} Recurrence Days {2} doesn't occur within given date range.", > e.ID, > e.StartDate, > e.RecurrenceDays); > } >} > >private static void ListDates(RecurringEvent e, IEnumerable<DateTime> evtDates) >{ > Console.WriteLine ("Event {0} with startdate {1} Recurrence Days {2} matches date range on:", > e.ID, > e.StartDate, > e.RecurrenceDays); > foreach (var date in evtDates) > { > Console.WriteLine ("\t{0}", date); > } >} > >public class RecurringEvent >{ > public int ID { get; set; } > public DateTime StartDate { get; set; } > public int RecurrenceDays { get; set; } >}Cetin
int days = (new int[] { (end - e.StartDate).Days, 0 }).Max(); //could be just?: int days = (end - e.StartDate).Days / e.RecurrenceDays;But still could be a lot of wasted calculations if the StartDate is way earlier than the range start ?
int edays = (end - e.StartDate).Days / e.RecurrenceDays; int sdays = (start - e.StartDate).Days / e.RecurrenceDays; evtDays = from d in Enumerable.Range(sdays, edays-sdays+1) let evtDate = e.StartDate.AddDays(d * e.RecurrenceDays) where evtDate >= start && evtDate <= end select evtDate; // list of matching dates