Exemplo n.º 1
0
            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);
            }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 3
0
 public bool Equals(SplitPointData <T> other)
 {
     return(EqualityComparer <T> .Default.Equals(Point, other.Point) && EndPoint == other.EndPoint);
 }