/// <summary> /// <para>Миниимальное значение из списка</para> /// </summary> /// <typeparam name="T">Тип значения, поддерживающий <see cref="IComparable"/></typeparam> /// <param name="values">Список значений</param> /// <returns>Минимальное значение из списка</returns> /// <exception cref="ArgumentNullException"/> /// <remarks>2021-04-18</remarks> public static T Min <T>(params T[] values) where T : IComparable { #region Check arguments #if CHECK_ARGS if ((values == null) || (values.Length < 1)) { throw new ArgumentNullException(nameof(values)); } #endif #endregion Check arguments var res = values[0]; #if SAFE_COMPARE IComparator <T> cmp = new SafeComparator <T>(); #else IComparator <T> cmp = new UnsafeComparator <T>(); #endif for (var i = 1L; i < values.LongLength; i++) { if (cmp.CompareValues(res, values[i]) > 0) { res = values[i]; } } return(res); }
/// <summary> /// <para>Поиск item по ключу key в сортированом по ключу списке sortedList.</para> /// <para>Если ключ не найден, то index содержит позицию, где объект с таким ключем должен быть.</para> /// <para>В противном случае index содержит позицию в списке искомого объекта</para> /// </summary> /// <typeparam name="T">Тип значения элемента списка</typeparam> /// <typeparam name="TKey">Тип ключа поиска</typeparam> /// <param name="sortedList">Список значений, сортированных по ключу в возростающем порядке /// (в противном случае результат неопределен)</param> /// <param name="key">Ключ поиска</param> /// <param name="hasDuplicate">Содержит ли список дублирующиеся значения</param> /// <returns><para>Результат поиска значения.</para> /// <para>Если true, то index содержит индекс ключа в списке.</para> /// <para>Если false, то index содержит индекс возможного расположения ключа в списке</para></returns> /// <remarks>2021-04-18</remarks> public static SearchResult Search <T, TKey>(this IList <T> sortedList, TKey key, bool hasDuplicate = false) where T : IComparable <TKey> { _ = sortedList ?? throw new ArgumentNullException(nameof(sortedList)); var l = 0; var h = sortedList.Count - 1; var res = false; #if SAFE_COMPARE IComparator <T, TKey> cmp = new SafeComparator <T, TKey>(); #else IComparator <T, TKey> cmp = new UnsafeComparator <T, TKey>(); #endif while (l <= h) { var i = (l + h) >> 1; var c = cmp.CompareValues(sortedList[i], key); if (c < 0) { l = i + 1; } else { h = i - 1; if (c == 0) { res = true; if (!hasDuplicate) { l = i; } } } } return(new SearchResult() { IsFound = res, Index = l }); }