Beispiel #1
0
        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);
 }