public void AddRange(int start, int limit) { if (start >= limit) { throw new ArgumentException(String.Format("start ({0}) cannot be >= to limit ({1})", start, limit)); } for (int i = 0; i < sortedRanges.Count; i++) { var range = sortedRanges[i]; if (start <= range.limit) { if (limit < range.start) { sortedRanges.Insert(i, new LimitRange(start, limit)); count += (uint)(limit - start); return; } if (start < range.start) { count += (uint)(range.start - start); sortedRanges[i] = new LimitRange(start, range.limit); } CombineRanges(i, limit); return; } } if (sortedRanges.Count == 0) { sortedRanges.Add(new LimitRange(start, limit)); count += (uint)(limit - start); return; } var lastRange = sortedRanges[sortedRanges.Count - 1]; if (lastRange.limit < start) { sortedRanges.Add(new LimitRange(start, limit)); count += (uint)(limit - start); } else { throw new NotImplementedException(); } }
/// <returns>True if the value was added</returns> public Boolean TryAdd(int value) { for (int i = 0; i < sortedRanges.Count; i++) { var range = sortedRanges[i]; if (value < range.start) { if (value + 1 == range.start) { sortedRanges[i] = new LimitRange(value, range.limit); } else { sortedRanges.Insert(i, new LimitRange(value, value + 1)); } count++; return(true); // was added } if (value.Equals(range.start)) { return(false); // was already added } } if (sortedRanges.Count == 0) { sortedRanges.Add(new LimitRange(value, value + 1)); count++; return(true); } var lastRange = sortedRanges[sortedRanges.Count - 1]; if (lastRange.limit < value) { sortedRanges.Add(new LimitRange(value, value + 1)); count++; return(true); // was added } if (lastRange.limit == value) { sortedRanges[sortedRanges.Count - 1] = new LimitRange(lastRange.start, value + 1); count++; return(true); // was added } return(false); // was already added }
protected AxisPanel() { //AddBehavior Interaction.GetBehaviors(this).Add(new InitializeBehavior()); ScrollInfo = this; ScrollOwner = this; //定数量16是因为太少的话反而会有效率影响,一般控件会在16个以内 //VerticalControls = new List<AxisControl>(16); HorizontalControls = new List<AxisControl>(16); _children = new List<AxisControl>(16); _viewportRangeX = new LimitRange<double>(); _dataRangeX = new LimitRange<DateTime>(); _viewportRangeY = new LimitRange<double>(); _dataRangeY = new LimitRange<int>(); }
void CombineRanges(int startRangeIndex, int limit) { var startRange = sortedRanges[startRangeIndex]; if (limit > startRange.limit) { var previousRange = startRange; for (int ii = startRangeIndex + 1; ; ii++) { if (ii >= sortedRanges.Count) { if (ii > startRangeIndex) { sortedRanges.RemoveRange(startRangeIndex + 1, ii - 1); } count += (uint)(limit - previousRange.limit); sortedRanges[startRangeIndex] = new LimitRange(startRange.start, limit); return; } var range = sortedRanges[ii]; if (limit < range.start) { if (ii > startRangeIndex) { sortedRanges.RemoveRange(startRangeIndex + 1, ii - 1); } count += (uint)(limit - previousRange.limit); sortedRanges[startRangeIndex] = new LimitRange(startRange.start, limit); return; } count += (uint)(range.start - previousRange.limit); if (limit <= range.limit) { if (ii > startRangeIndex) { sortedRanges.RemoveRange(startRangeIndex + 1, ii); } sortedRanges[startRangeIndex] = new LimitRange(startRange.start, range.limit); return; } previousRange = range; } } }