Exemple #1
0
        public IEnumerable <KeyValuePair <Range <TKey>, TValue> > Slice(Range <TKey> range)
        {
            switch (this.items.Count)
            {
            case 0:
                break;

            case 1:
                var single     = this.items[0];
                var singleFrom = Incrementor <TKey> .Max(single.Key.From, range.From);

                var singleTo = Incrementor <TKey> .Min(single.Key.To, range.To);

                if (singleFrom.CompareTo(singleTo) <= 0)
                {
                    yield return(new KeyValuePair <Range <TKey>, TValue>(new Range <TKey>(singleFrom, singleTo), single.Value));
                }
                break;

            default:
                var left = RangeOperations <TKey> .BinarySearch(this.Keys, range.From);

                if (left < 0)
                {
                    left = ~left;
                }
                var right = RangeOperations <TKey> .BinarySearch(this.Keys, range.From);

                if (right < 0)
                {
                    right = ~right - 1;
                }
                for (var i = left; i <= right; i++)
                {
                    var current = this.items[i];
                    var from    = current.Key.From;
                    var to      = current.Key.To;
                    yield return(new KeyValuePair <Range <TKey>, TValue>(
                                     new Range <TKey>((i == left) && (@from.CompareTo(range.From) < 0) ? range.From : from, (i == right) && (to.CompareTo(range.To) > 0) ? range.To : to),
                                     current.Value));
                }
                break;
            }
        }