internal RangeView <TElement> InternalFindMany(TKey key, bool ascendant, int comparerCount) { if (comparerCount == 1) { var lo = BinarySearch.LowerBound(orderedData, 0, orderedData.Count, key, indexSelector, comparers[0]); if (lo == -1) { return(RangeView <TElement> .Empty()); } var hi = BinarySearch.UpperBound(orderedData, 0, orderedData.Count, key, indexSelector, comparers[0]); return(new RangeView <TElement>(orderedData, lo, hi, ascendant)); } else { var lo = 0; var hi = orderedData.Count; for (int i = 0; i < comparerCount; i++) { var comparer = comparers[i]; var newlo = BinarySearch.LowerBound(orderedData, lo, hi, key, indexSelector, comparer); if (newlo == -1 || !(lo <= newlo) && (newlo < hi)) { return(RangeView <TElement> .Empty()); } var newhi = BinarySearch.UpperBound(orderedData, lo, hi, key, indexSelector, comparer); if (newhi == -1 || !(lo <= newhi) && (newhi < hi)) { return(RangeView <TElement> .Empty()); } lo = newlo; hi = newhi + 1; } return(new RangeView <TElement>(orderedData, lo, hi - 1, ascendant)); } }
IEnumerable <T> DefaultIfEmpty <T>(RangeView <T> view, bool defaultIfEmpty) { return((defaultIfEmpty) ? view.DefaultIfEmpty() : view); }