Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Linq;
- namespace System.Collections.Generic
- {
- /// <summary>Методы-расширения класса IEnumerable-T</summary>
- public static class Enumeration
- {
- /// <summary>Преобразование в массив с заданием начальной размерности массива и получение реально заполненных элементов</summary>
- /// <param name="source">The source to act on</param>
- /// <param name="capacity">[in,out] размерность массива (начальное значение может быть как меньше, так и больше финальной размерности
- /// массива, но чем точнее будет указан, тем быстрее отработает метод)</param>
- /// <param name="count">[out] число реально внесённых в массив элементов (<= размерности массива)</param>
- /// <returns>Массив</returns>
- public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source, ref int capacity, out int count)
- {
- if (source != null)
- {
- if (capacity <= 0) throw new ArgumentOutOfRangeException("capacity");
- var array = new TSource[capacity];
- int i = 0;
- foreach (var item in source)
- {
- array[i++] = item;
- if (i == capacity)
- {
- var newArray = new TSource[checked(i >> 1)];
- Array.Copy(array, 0, newArray, 0, capacity);
- array = newArray;
- capacity = array.Length;
- }
- }
- count = i;
- return array;
- }
- else
- {
- count = 0;
- return null;
- }
- }
- /// <summary>Преобразование в массив с заданием начальной размерности массива и получение реально заполненных элементов</summary>
- /// <param name="capacity">Оценка размерности массива (может быть как меньше, так и больше финальной размерности массива, но чем точнее
- /// будет указан, тем быстрее отработает метод)</param>
- /// <param name="count">[out] число реально внесённых в массив элементов (<= размерности массива)</param>
- /// <returns>Массив</returns>
- public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source, int capacity, out int count)
- {
- return source.ToArray(ref capacity, out count);
- }
- /// <summary>Преобразование в массив с заданием ожидаемого числа элементов,
- /// на большом числе элементов будет работать несколько быстрее, чем ToArray() без параметров
- /// Размер массива (Length) всегда будет равен числу реально взятых из последовательности элементов.
- /// capacity при этом может быть как меньше, так и больше финальной размерности массива, но чем точнее будет указан, тем быстрее отработает метод</summary>
- /// <param name="capacity">число реально внесённых в массив элементов (<= размерности массива)</param>
- /// <returns>Массив</returns>
- public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source, int capacity)
- {
- if (capacity <= 0) throw new ArgumentOutOfRangeException("capacity");
- int finalCount;
- TSource[] result = source.ToArray(ref capacity, out finalCount);
- if (result != null && result.Length > finalCount)
- Array.Resize(ref result, finalCount);
- return result;
- }
- /// <summary>Преобразование в массив с заданием ожидаемого числа элементов,
- /// на большом числе элементов будет работать несколько быстрее, чем ToList() без параметров</summary>
- /// <param name="source">The source to act on</param>
- /// <param name="capacity">Оценка финальной размерности массива (может быть как меньше, так и больше финальной размерности массива, но чем точнее
- /// будет указан, тем быстрее отработает метод)</param>
- /// <returns>Список</returns>
- public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source, int capacity)
- {
- if (source != null)
- {
- if (capacity <= 0) throw new ArgumentOutOfRangeException("capacity");
- List<TSource> result = new List<TSource>(capacity);
- foreach (var item in source)
- result.Add(item);
- return result;
- }
- else
- return null;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment