/// <summary> /// Performs the specified action on each <see cref="TimedEvent"/> contained in the <see cref="EventsCollection"/>. /// </summary> /// <param name="eventsCollection"><see cref="EventsCollection"/> to search for events to process.</param> /// <param name="action">The action to perform on each <see cref="TimedEvent"/> contained in the /// <paramref name="eventsCollection"/>.</param> /// <param name="match">The predicate that defines the conditions of the <see cref="TimedEvent"/> to process.</param> /// <returns>Count of processed timed events.</returns> /// <exception cref="ArgumentNullException"> /// <para>One of the following errors occured:</para> /// <list type="bullet"> /// <item> /// <description><paramref name="eventsCollection"/> is <c>null</c>.</description> /// </item> /// <item> /// <description><paramref name="action"/> is <c>null</c>.</description> /// </item> /// <item> /// <description><paramref name="match"/> is <c>null</c>.</description> /// </item> /// </list> /// </exception> public static int ProcessTimedEvents(this EventsCollection eventsCollection, Action <TimedEvent> action, Predicate <TimedEvent> match) { ThrowIfArgument.IsNull(nameof(eventsCollection), eventsCollection); ThrowIfArgument.IsNull(nameof(action), action); ThrowIfArgument.IsNull(nameof(match), match); var iMatched = 0; var timesChanged = false; var timedEvents = new List <TimedEvent>(eventsCollection.Count); foreach (var timedEvent in eventsCollection.GetTimedEventsLazy(false)) { if (match(timedEvent)) { var time = timedEvent.Time; action(timedEvent); timesChanged = timedEvent.Time != time; iMatched++; } timedEvents.Add(timedEvent); } if (timesChanged) { eventsCollection.SortAndUpdateEvents(timedEvents); } return(iMatched); }