public override ClassificationSpanListSegmentModel CreateSegment(ListSegment <ClassificationSpan> segmentSpans) { return(new ClassificationSpanListSegmentModel() { LocalSymbolGroupIds = IntegerListModel.Create(segmentSpans, span => span.LocalGroupId) }); }
public SpanListModel( IReadOnlyList <TSpan> spans, IEqualityComparer <TSharedKey> sharedKeyComparer = null, IComparer <TSharedKey> sharedKeySorter = null, IComparer <TShared> sharedValueSorter = null) : this() { Optimize = true; Count = spans.Count; List <TSharedKey> sharedKeys = new List <TSharedKey>(); Dictionary <TSharedKey, int> sharedMap = new Dictionary <TSharedKey, int>(sharedKeyComparer ?? EqualityComparer <TSharedKey> .Default); foreach (var span in spans) { var sharedKey = GetSharedKey(span); if (!sharedMap.ContainsKey(sharedKey)) { sharedMap.Add(sharedKey, SharedValues.Count); SharedValues.Add(GetShared(span)); sharedKeys.Add(sharedKey); } } if (sharedValueSorter != null || sharedKeySorter != null) { TSharedKey[] sharedKeyArray = sharedKeys.ToArray(); TShared[] sharedValueArray = SharedValues.ToArray(); if (sharedValueSorter != null) { Array.Sort(sharedValueArray, sharedKeyArray, sharedValueSorter); } else { Array.Sort(sharedKeyArray, sharedValueArray, sharedKeySorter); } // Ensure shared keys is not used after this point sharedKeys = null; SharedValues.Clear(); SharedValues.AddRange(sharedValueArray); for (int index = 0; index < sharedKeyArray.Length; index++) { sharedMap[sharedKeyArray[index]] = index; } } var segmentsLength = NumberUtils.Ceiling(spans.Count, SegmentSpanCount); int offset = 0; for (int segmentIndex = 0; segmentIndex < segmentsLength; segmentIndex++, offset += SegmentSpanCount) { var length = Math.Min(SegmentSpanCount, spans.Count - offset); if (length == 0) { break; } var segmentSpans = new ListSegment <TSpan>(spans, offset, length); var segment = CreateSegment(segmentSpans); Segments.Add(segment); var firstSpanStart = segmentSpans[0].Start; var lastSpan = segmentSpans[length - 1]; segment.Starts = IntegerListModel.Create(segmentSpans, s => GetStart(s, SharedValues[sharedMap[GetSharedKey(s)]])); segment.Lengths = IntegerListModel.Create(segmentSpans, s => s.Length); segment.FullLength = (lastSpan.Start + lastSpan.Length) - firstSpanStart; segment.SharedIndices = IntegerListModel.Create(segmentSpans, s => sharedMap[GetSharedKey(s)]); } }