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; } }