public int Compare(SplitPointData <T> x, SplitPointData <T> y) { var pointCompare = x.Point.CompareTo(y.Point); return(pointCompare == 0 ? Comparer <int> .Default.Compare(GetEndPointValue(x.EndPoint), GetEndPointValue(y.EndPoint)) : pointCompare); }
internal static List <IntervalItem <TItem, T> > Split <TItem, T>(IEnumerable <IntervalItem <TItem, T> > rangeItems) where T : IComparable <T> { // TODO Very naive implementation. Rework. var rangeItemPairs = rangeItems.ToList(); var result = new List <IntervalItem <TItem, T> >(); var sortDictionary = new Dictionary <TItem, int>(); for (var index = 0; index < rangeItemPairs.Count; index++) { var rangeItemPair = rangeItemPairs[index]; if (sortDictionary.ContainsKey(rangeItemPair.Item) == false) { sortDictionary.Add(rangeItemPair.Item, index); } } if (rangeItemPairs.Count < 2) { result.AddRange(rangeItemPairs); return(result); } var splitPoints = new List <SplitPointData <T> >(); var distinctSet = new HashSet <IntervalItem <TItem, T> >(); var distinctPoint = new HashSet <SplitPointData <T> >(); foreach (var rangeItemPair in rangeItemPairs) { { var splitPointData = new SplitPointData <T>(rangeItemPair.Interval.Minimum, IntervalEndPoint.Open); if (distinctPoint.Add(splitPointData)) { splitPoints.Add(splitPointData); } } { var splitPointData = new SplitPointData <T>(rangeItemPair.Interval.Minimum, IntervalEndPoint.Closed); if (distinctPoint.Add(splitPointData)) { splitPoints.Add(splitPointData); } } { var splitPointData = new SplitPointData <T>(rangeItemPair.Interval.Maximum, IntervalEndPoint.Open); if (distinctPoint.Add(splitPointData)) { splitPoints.Add(splitPointData); } } { var splitPointData = new SplitPointData <T>(rangeItemPair.Interval.Maximum, IntervalEndPoint.Closed); if (distinctPoint.Add(splitPointData)) { splitPoints.Add(splitPointData); } } } splitPoints.Sort(SplitDataPointComparer <T> .Default); var prevPoint = splitPoints[0].Point; var prevSame = false; for (var iPoint = 1; iPoint < splitPoints.Count; iPoint++) { var splitPointData = splitPoints[iPoint]; var startEndPoint = prevSame ? IntervalEndPoint.Open : IntervalEndPoint.Closed; var currentPoint = splitPointData.Point; var same = prevPoint.CompareTo(currentPoint) == 0; var range = same ? new Interval <T>(prevPoint, currentPoint) : new Interval <T>(prevPoint, startEndPoint, currentPoint, IntervalEndPoint.Open); prevPoint = currentPoint; prevSame = same; var items = rangeItemPairs.Where(ri => ri.Interval.Contains(range)).Select(ri => new IntervalItem <TItem, T>(ri.Item, range)); result.AddRange(items.Where(distinctSet.Add)); } return(result.OrderBy(r => sortDictionary[r.Item]).ThenBy(r => r.Interval).ToList()); }
public bool Equals(SplitPointData <T> other) { return(EqualityComparer <T> .Default.Equals(Point, other.Point) && EndPoint == other.EndPoint); }