ZelAnton

Untitled

Mar 13th, 2015
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.68 KB | None | 0 0
  1. using System.Linq;
  2.  
  3. namespace System.Collections.Generic
  4. {
  5.     /// <summary>Методы-расширения класса IEnumerable-T</summary>
  6.     public static class Enumeration
  7.     {
  8.         /// <summary>Преобразование в массив с заданием начальной размерности массива и получение реально заполненных элементов</summary>
  9.         /// <param name="source">The source to act on</param>
  10.         /// <param name="capacity">[in,out] размерность массива (начальное значение может быть как меньше, так и больше финальной размерности
  11.         /// массива, но чем точнее будет указан, тем быстрее отработает метод)</param>
  12.         /// <param name="count">[out] число реально внесённых в массив элементов (<= размерности массива)</param>
  13.         /// <returns>Массив</returns>
  14.         public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source, ref int capacity, out int count)
  15.         {
  16.             if (source != null)
  17.             {
  18.                 if (capacity <= 0) throw new ArgumentOutOfRangeException("capacity");
  19.                 var array = new TSource[capacity];
  20.                 int i = 0;
  21.                 foreach (var item in source)
  22.                 {
  23.                     array[i++] = item;
  24.                     if (i == capacity)
  25.                     {
  26.                         var newArray = new TSource[checked(i >> 1)];
  27.                         Array.Copy(array, 0, newArray, 0, capacity);
  28.                         array = newArray;
  29.                         capacity = array.Length;
  30.                     }
  31.                 }
  32.                 count = i;
  33.  
  34.                 return array;
  35.             }
  36.             else
  37.             {
  38.                 count = 0;
  39.                 return null;
  40.             }
  41.         }
  42.  
  43.         /// <summary>Преобразование в массив с заданием начальной размерности массива и получение реально заполненных элементов</summary>
  44.         /// <param name="capacity">Оценка размерности массива (может быть как меньше, так и больше финальной размерности массива, но чем точнее
  45.         /// будет указан, тем быстрее отработает метод)</param>
  46.         /// <param name="count">[out] число реально внесённых в массив элементов (<= размерности массива)</param>
  47.         /// <returns>Массив</returns>
  48.         public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source, int capacity, out int count)
  49.         {
  50.             return source.ToArray(ref capacity, out count);
  51.         }
  52.  
  53.         /// <summary>Преобразование в массив с заданием ожидаемого числа элементов,
  54.         ///          на большом числе элементов будет работать несколько быстрее, чем ToArray() без параметров
  55.         ///          Размер массива (Length) всегда будет равен числу реально взятых из последовательности элементов.
  56.         ///          capacity при этом может быть как меньше, так и больше финальной размерности массива, но чем точнее будет указан, тем быстрее отработает метод</summary>
  57.         /// <param name="capacity">число реально внесённых в массив элементов (<= размерности массива)</param>
  58.         /// <returns>Массив</returns>
  59.         public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source, int capacity)
  60.         {
  61.             if (capacity <= 0) throw new ArgumentOutOfRangeException("capacity");
  62.             int finalCount;
  63.             TSource[] result = source.ToArray(ref capacity, out finalCount);
  64.             if (result != null && result.Length > finalCount)
  65.                 Array.Resize(ref result, finalCount);
  66.             return result;
  67.         }
  68.  
  69.         /// <summary>Преобразование в массив с заданием ожидаемого числа элементов,
  70.         ///          на большом числе элементов будет работать несколько быстрее, чем ToList() без параметров</summary>
  71.         /// <param name="source">The source to act on</param>
  72.         /// <param name="capacity">Оценка финальной размерности массива (может быть как меньше, так и больше финальной размерности массива, но чем точнее
  73.         /// будет указан, тем быстрее отработает метод)</param>
  74.         /// <returns>Список</returns>
  75.         public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source, int capacity)
  76.         {
  77.             if (source != null)
  78.             {
  79.                 if (capacity <= 0) throw new ArgumentOutOfRangeException("capacity");
  80.                 List<TSource> result = new List<TSource>(capacity);
  81.                 foreach (var item in source)
  82.                     result.Add(item);
  83.                 return result;
  84.             }
  85.             else
  86.                 return null;
  87.         }
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment