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