public static string Virtualise(this string source, TextScrollInfo scroll) { if (scroll == null || scroll.TotalChars == 0) return source; return new string(source.Skip(scroll.FirstIndex).Take(scroll.TotalChars).ToArray()); }
public static IEnumerable<DisplayText> Virtualise(this IEnumerable<DisplayText> source, TextScrollInfo scroll) { var items = source.AsArray(); if (scroll == null || scroll.TotalChars == 0) return items; // var list = new List<DisplayText>(items.Length); int lastIndex = scroll.FirstIndex + scroll.TotalChars; var displayBounds = items.Aggregate(new List<DisplayWithIndex>(), (state, latest) => { if (state.Count == 0) { state.Add( new DisplayWithIndex(latest, 0)); } else { var last = state.Last(); state.Add(new DisplayWithIndex(latest, last.StartIndex + last.Text.Length)); } return state; }).ToArray(); var result = displayBounds .Select(item => { if (item.Inbounds(scroll.FirstIndex, lastIndex)) { //clip it and yield return item.Clip(scroll.FirstIndex, lastIndex); } return null; }).Where(item => item != null) .ToArray(); return result; }