Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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
            });
        }