public static int FindLastIndex(this IPlaylist playlist, Func <IPlaylistItem, bool> predicate) { return(playlist.FindLastIndex(playlist.Count - 1, predicate)); }
private void AddTiming2(DateTime startTime, IPlaySource playSource) { // 验证操作的合法性。 ValidatePlayDuration(playSource.PlayRange.Duration); ValidateStartTime(startTime, false); EnsureNoTimingConflict(startTime, playSource.PlayRange.Duration); // 触发事件前置事件。 List <PlaybillItem> tempList = new List <PlaybillItem>(); // 重新计算调度信息。 DateTime beginTime; var prevIndex = _playlist.FindLastIndex(i => !i.IsSkipped() && i.ScheduleInfo.StopTime <= startTime); if (prevIndex == -1) { if (_playlist.Count == 0) { if (_playlist.HasMinStartTime() && _playlist.MinStartTime.Value < startTime) { beginTime = _playlist.MinStartTime.Value; } else { beginTime = startTime; } } else { beginTime = _playlist[0].ScheduleInfo.StartTime; // startTime; beginTime = beginTime > startTime ? startTime : beginTime; } // [prevIndex+1, index-1], 注:index-prevIndex+1 // 替换范围:[prevIndex+1, index-1] (删除的起始索引0==prevIndex+1,数量index==index-prevIndex-1) } else { beginTime = _playlist[prevIndex].ScheduleInfo.StopTime; // 注:prevIndex可能等于index-1。 // 当prevIndex小于index-1时。 // 替换范围:[prevIndex + 1, index-1] (删除的起始索引prevIndex + 1,数量index-prevIndex-1 ) // 当prevIndex等于index-1时。(删除的起始索引prevIndex + 1==index,数量index-prevIndex-1==0 ) // 在index处插入0个或1个。 } DateTime endTime; var nextIndex = _playlist.FindFirstIndex(prevIndex + 1, i => !i.IsSkipped() && i.ScheduleInfo.ScheduleMode == ScheduleMode.Timing && i.ScheduleInfo.StartTime > startTime); //beginTime = playItem.ScheduleInfo.StopTime; if (nextIndex == -1) { endTime = DateTime.MaxValue; nextIndex = _playlist.Count; // [index + 1, _playlist.Count - 1], 注:index + 1可能等于_playlist.Count - 1 // 替换范围:[index + 1, _playlist.Count - 1] (删除的起始索引index + 1, 数量nextIndex-index-1==_playlist.Count-index-1) } else { endTime = _playlist[nextIndex].ScheduleInfo.StartTime; // 注:nextIndex可能等于index+1。 // 当nextIndex大于index+1时。 // 替换范围:[index+1, nextIndex-1] (删除的起始索引index+1,数量nextIndex-index-1 ) // 当nextIndex等于index+1时。(删除的起始索引index+1, 数量nextIndex-index-1==0 ) // 在index+1处插入0个或1个。 } PlaybillItem playItem = PlaybillItem.CreateTiming(startTime, new NormalPlaySource(playSource), false); Debug.Assert(beginTime <= endTime); Debug.Assert(beginTime <= startTime && endTime > playItem.ScheduleInfo.StopTime); for (int i = prevIndex + 1; i < nextIndex; i++) { tempList.Add(_playlist[i].PlaybillItem); //builder.Add(_playlist[i].PlaybillItem); } // case 1: prevIndex + 1==nextIndex-1,替换起始位置prevIndex + 1,删除数量1 (nextIndex-1-prevIndex) // case 2: prevIndex + 1<nextIndex-1,替换起始位置prevIndex + 1,删除数量1 (nextIndex-1-prevIndex) // case 3: prevIndex + 1>nextIndex-1 // 替换范围为[prevIndex + 1, nextIndex-1] // 触发事件(表示操作完成)。 }