public IList <ConferenceComponent> CalculateTalksForSession (IList <ConferenceComponent> allTalks, int maximumMinutes, int startingTime) { if (allTalks == null) { throw new ArgumentNullException(); } if (maximumMinutes <= 0 || startingTime < 0) { throw new ArgumentOutOfRangeException(); } var totalLength = 0; var sessionTalks = new List <ConferenceComponent>(); ConferenceComponent previousLeaf = null; foreach (var talk in allTalks) { if (totalLength + talk.Duration <= maximumMinutes) { totalLength += talk.Duration; talk.TimeStamp = previousLeaf != null ? _timeService.CalculateTimeStampFromPrevious(previousLeaf.TimeStamp, previousLeaf.Duration) : _timeService.CalculateStartingTimeStamp(startingTime); sessionTalks.Add(talk); previousLeaf = talk; } } return(sessionTalks); }