private static Func <string, string, string, bool> GetRangePredicateFunction(this RangeInclude src)
        {
            switch (src)
            {
            case RangeInclude.Both:
                return(Utils.RangeBetweenIncludingBoth);

            case RangeInclude.Neither:
                return(Utils.RangeBetweenExcludingBoth);

            case RangeInclude.Lower:
                return(Utils.RangeBetweenIncludingLower);

            case RangeInclude.Higher:
                return(Utils.RangeBetweenIncludingHigher);
            }

            throw new Exception("Unknown Range Include: " + src);
        }
        public static IEnumerable <KeyValuePair <string, TValue> > GetRange <TValue>(this SortedList <string, TValue> src, string keyFrom, string keyTo, RangeInclude rangeInclude)
        {
            var rangeIncludeFunc = rangeInclude.GetRangePredicateFunction();

            if (string.CompareOrdinal(keyFrom, keyTo) > 0)
            {
                return(Array.Empty <KeyValuePair <string, TValue> >());
            }

            if (src.Count < MinAmountToScan)
            {
                return(src.Where(itm => rangeIncludeFunc(itm.Key, keyFrom, keyTo)));
            }


            var fromIndex = src.FindNearest(keyFrom);

            var toIndex = src.FindNearest(keyTo);

            var result = new List <KeyValuePair <string, TValue> >();

            for (var i = fromIndex; i <= toIndex; i++)
            {
                if (rangeIncludeFunc(src.Keys[i], keyFrom, keyTo))
                {
                    result.Add(new KeyValuePair <string, TValue>(src.Keys[i], src.Values[i]));
                }
            }

            return(result);
        }