internal static int CompiledBinarySearchWithClosure <T>(IList <T> source, T value, IComparer <T> comparer = null) { Closure2 <T> closure = new Closure2 <T>() { Source = source, Value = value, Comparer = comparer }; return(CompiledLocalBinarySearch(0, source.Count - 1, ref closure)); }
private static int CompiledLocalBinarySearch <T>(int startIndex, int endIndex, ref Closure2 <T> closure) { if (startIndex > endIndex) { return(-1); } int middleIndex = startIndex + (endIndex - startIndex) / 2; int compare = closure.Comparer.Compare(closure.Source[middleIndex], closure.Value); if (compare == 0) { return(middleIndex); } return(compare <= 0 ? CompiledLocalBinarySearch(middleIndex + 1, endIndex, ref closure) : CompiledLocalBinarySearch(startIndex, middleIndex - 1, ref closure)); }