Ejemplo n.º 1
0
        public static int DuplicateBinarySearch <T, TTarget>(
            [NotNull] this IList <T> values,
            [NotNull] SingleComparer <TTarget> comparer,
            [NotNull] Func <T, TTarget> converter)
        {
            if (comparer == null)
            {
                throw new ArgumentNullException(nameof(comparer));
            }
            if (values.Count == 0)
            {
                return(-1);
            }
            int     start               = 0;
            int     end                 = values.Count - 1;
            int     midIndex            = end / 2;
            int     firstOccuranceIndex = -1;
            TTarget midItem             = converter.Invoke(values[midIndex]);
            int     compareResult       = comparer.Compare(midItem);

            while (start <= end)
            {
                if (compareResult < 0)
                {
                    start = midIndex + 1;
                }
                else
                {
                    end = midIndex - 1;
                    if (compareResult == 0)
                    {
                        firstOccuranceIndex = midIndex;
                    }
                }
                midIndex      = (start + end) / 2;
                midItem       = converter.Invoke(values[midIndex]);
                compareResult = comparer.Compare(midItem);
            }
            return(firstOccuranceIndex);
        }