Ejemplo n.º 1
0
        /// <summary>
        /// Генерирует список, содержащий повторяющееся значение.
        /// </summary>
        /// <typeparam name="TResult">Тип значения, которое будет повторяться в результирующем списке.</typeparam>
        /// <param name="element">Повторяемое значение.</param>
        /// <param name="count">Требуемое число повторений значения в создаваемом списке.</param>
        /// <returns>Список, содержащий повторяющееся значение.</returns>
        public static IReadOnlyList <TResult> Repeat <TResult> (TResult element, int count)
        {
            if (count < 0)
            {
                throw new ArgumentOutOfRangeException("count");
            }
            Contract.EndContractBlock();

            switch (count)
            {
            case 0:
                return(EmptyReadOnlyList <TResult> .GetInstance());

            case 1:
                return(new TResult[] { element });

            case 2:
                return(new TResult[] { element, element });

            case 3:
                return(new TResult[] { element, element, element });

            default:
                return(new RepeatReadOnlyList <TResult> (element, count));
            }
        }
Ejemplo n.º 2
0
        public static IReadOnlyList <int> Range(int start, int count)
        {
            if ((count < 0) || (((long)start + (long)count - 1L) > (long)int.MaxValue))
            {
                throw new ArgumentOutOfRangeException("count");
            }
            Contract.EndContractBlock();

            switch (count)
            {
            case 0:
                return(EmptyReadOnlyList <int> .GetInstance());

            case 1:
                return(new int[] { start });

            case 2:
                return(new int[] { start, start + 1 });

            case 3:
                return(new int[] { start, start + 1, start + 2 });

            default:
                return(new RangeReadOnlyList(start, count));
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Проецирует каждый элемент списка в новую форму, добавляя индекс элемента.
        /// </summary>
        /// <typeparam name="TSource">Тип элементов списка source.</typeparam>
        /// <typeparam name="TResult">Тип значения, возвращаемого функцией selector.</typeparam>
        /// <param name="source">Список значений, для которых вызывается функция преобразования.</param>
        /// <param name="selector">Функция преобразования, применяемая к каждому исходному элементу;
        /// второй параметр функции представляет индекс исходного элемента.</param>
        /// <returns>Список, элементы которого получены в результате вызова функции преобразования
        /// для каждого элемента списка source.</returns>
        public static IReadOnlyList <TResult> Select <TSource, TResult> (this IReadOnlyList <TSource> source, Func <TSource, int, TResult> selector)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            if (selector == null)
            {
                throw new ArgumentNullException("selector");
            }
            Contract.EndContractBlock();

            return((source.Count < 1) ?
                   (IReadOnlyList <TResult>) EmptyReadOnlyList <TResult> .GetInstance() :
                   new SelectIndexReadOnlyList <TSource, TResult> (source, selector));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Объединяет две списка, используя указанную функцию предиката.
        /// </summary>
        /// <typeparam name="TFirst">Тип элементов первого входного списка.</typeparam>
        /// <typeparam name="TSecond">Тип элементов второго входного списка.</typeparam>
        /// <typeparam name="TResult">Тип элементов результирующего списка.</typeparam>
        /// <param name="first">Первый список для объединения.</param>
        /// <param name="second">Второй список для объединения.</param>
        /// <param name="selector">Функция, которая определяет, как объединить элементы двух списков.</param>
        /// <returns>Список, содержащий объединенные элементы двух входных списков.</returns>
        public static IReadOnlyList <TResult> Zip <TFirst, TSecond, TResult> (this IReadOnlyList <TFirst> first, IReadOnlyList <TSecond> second, Func <TFirst, TSecond, TResult> selector)
        {
            if (first == null)
            {
                throw new ArgumentNullException("first");
            }
            if (second == null)
            {
                throw new ArgumentNullException("second");
            }
            if (selector == null)
            {
                throw new ArgumentNullException("selector");
            }
            Contract.EndContractBlock();

            return(((first.Count < 1) || (second.Count < 1)) ?
                   (IReadOnlyList <TResult>) EmptyReadOnlyList <TResult> .GetInstance() :
                   new ZipReadOnlyList <TFirst, TSecond, TResult> (first, second, selector));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Возвращает указанное число подряд идущих элементов с начала списка.
        /// </summary>
        /// <typeparam name="TSource">Тип элементов списка.</typeparam>
        /// <param name="source">Список, из которого требуется возвратить элементы.</param>
        /// <param name="count">Число возвращаемых элементов.</param>
        /// <returns>Список, содержащий заданное число элементов с начала входного списка.</returns>
        public static IReadOnlyList <TSource> Take <TSource> (this IReadOnlyList <TSource> source, int count)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            if (count < 0)
            {
                throw new ArgumentOutOfRangeException("count");
            }
            Contract.EndContractBlock();

            if (source.Count < 1)
            {
                return(EmptyReadOnlyList <TSource> .GetInstance());
            }
            if (count >= source.Count)
            {
                return(source);
            }
            return(new TakeReadOnlyList <TSource> (source, count));
        }
Ejemplo n.º 6
0
 /// <summary>
 /// Создаёт пустой список.
 /// </summary>
 /// <typeparam name="TResult">Тип элементов списка.</typeparam>
 /// <returns>Пустой список.</returns>
 public static IReadOnlyList <TResult> Empty <TResult> ()
 {
     return(EmptyReadOnlyList <TResult> .GetInstance());
 }