Expl.Itinerary.ListSchedule.GetRange C# (CSharp) Method

GetRange() public method

public GetRange ( System.DateTime RangeStart, System.DateTime RangeEnd ) : IEnumerable
RangeStart System.DateTime
RangeEnd System.DateTime
return IEnumerable
        public IEnumerable<TimedEvent> GetRange(DateTime RangeStart, DateTime RangeEnd)
        {
            // Get iterators from each schedule
             List<SpyEnumerator<TimedEvent>> Iterators = new List<SpyEnumerator<TimedEvent>>(_Schedules.Count);
             foreach (ISchedule Schedule1 in _Schedules)
            Iterators.Add(Schedule1.GetRange(RangeStart, RangeEnd).GetSpyEnumerator());

             // Batch loop
             List<TimedEvent> BatchEvents = new List<TimedEvent>(MaxScheduleBufferSize * _Schedules.Count);
             for (; ; ) {
            DateTime? BatchEndTime = null;

            // Peek first events from each iterator
            foreach (SpyEnumerator<TimedEvent> Iterator in Iterators) {
               if (Iterator.HasMore) {
                  TimedEvent Evt1 = Iterator.Peek;
                     if (!BatchEndTime.HasValue || Evt1.StartTime < BatchEndTime.Value)
                     BatchEndTime = Evt1.StartTime;
               }
            }

            // Check if no more events can be iterated, break out
            if (!BatchEndTime.HasValue) break;

            // Iterate events up to BatchEndTime
            foreach (SpyEnumerator<TimedEvent> Iterator in Iterators) {
               int BatchSize = 0;
               while (Iterator.HasMore) {
                  TimedEvent Evt1 = Iterator.Peek;
                  if (Evt1.StartTime > BatchEndTime) break;
                  Iterator.MoveNext();
                  BatchEvents.Add(Evt1);
                  BatchSize++;

                  if (BatchSize >= MaxScheduleBufferSize) {
                     // Max buffer size reached
                     // Set new BatchEndTime and skip to next schedule
                     BatchEndTime = Evt1.StartTime;
                     break;
                  }
               }
            }

            // If no more events can be had, break from iteration
            if (BatchEvents.Count == 0) break;

            // Sort batch results to ensure chronological order, then return each event
            BatchEvents.Sort();
            int BatchIdx;
            for (BatchIdx = 0; BatchIdx < BatchEvents.Count; BatchIdx++) {
               TimedEvent Evt1 = BatchEvents[BatchIdx];
               if (Evt1.StartTime > BatchEndTime) break;
               yield return Evt1;
            }

            // Clear event list and repeat
            BatchEvents.RemoveRange(0, BatchIdx);
             }

             yield break;
        }

Usage Example

Example #1
0
        // Optimized 2008-07-13
        public IEnumerable <TimedEvent> GetRange(DateTime RangeStart, DateTime RangeEnd)
        {
            // AAAA
            //   BBBB
            // xxxxxx
            //
            // AA
            //   BB
            // xxxx
            //
            // AAAA
            //   BBBB
            // xxxxxx
            //       CC
            // xxxxxxxx

            TimedEvent MatchEvent = null;

            foreach (TimedEvent A in _Schedule.GetRange(RangeStart, RangeEnd))
            {
                if (MatchEvent == null)
                {
                    // Load up MatchEvent
                    MatchEvent = A;
                }
                else if (MatchEvent.Intersects(A) || MatchEvent.IsAdjacentTo(A))
                {
                    // Compute union and move on
                    MatchEvent = MatchEvent.Union(A)[0];
                }
                else
                {
                    // No intersection, return MatchEvent
                    yield return(MatchEvent);

                    MatchEvent = A;
                }
            }

            // If MatchEvent has a value, return it
            if (MatchEvent != null)
            {
                yield return(MatchEvent);
            }

            yield break;
        }
All Usage Examples Of Expl.Itinerary.ListSchedule::GetRange