/// <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)); } }
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)); } }
/// <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)); }
/// <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)); }
/// <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)); }
/// <summary> /// Создаёт пустой список. /// </summary> /// <typeparam name="TResult">Тип элементов списка.</typeparam> /// <returns>Пустой список.</returns> public static IReadOnlyList <TResult> Empty <TResult> () { return(EmptyReadOnlyList <TResult> .GetInstance()); }