Optimized ToList and ToArray extension methods

This commit is contained in:
Chris Cameron
2017-12-13 10:44:17 -05:00
parent ca2c0fb38f
commit 30afd0391d
2 changed files with 61 additions and 0 deletions

View File

@@ -288,6 +288,24 @@ namespace ICD.Common.Utils.Tests.Extensions
Assert.AreEqual(3, values[1]);
}
[Test]
public void ToArrayCountTest()
{
int[] array = Enumerable.Range(0, 100).ToArray();
int[] copy = array.ToArray(array.Length);
Assert.IsTrue(copy.SequenceEqual(array));
}
[Test]
public void ToListCountTest()
{
List<int> array = Enumerable.Range(0, 100).ToList();
List<int> copy = array.ToList(array.Count);
Assert.IsTrue(copy.SequenceEqual(array));
}
[Test]
public void ToHashSetTest()
{

View File

@@ -504,6 +504,49 @@ namespace ICD.Common.Utils.Extensions
return new IcdHashSet<T>(extends);
}
/// <summary>
/// Optimized ToArray implementation with fewer allocations.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="extends"></param>
/// <param name="count"></param>
/// <returns></returns>
public static T[] ToArray<T>(this IEnumerable<T> extends, int count)
{
if (extends == null)
throw new ArgumentNullException("extends");
if (count < 0)
throw new ArgumentOutOfRangeException("count");
T[] array = new T[count];
int i = 0;
foreach (T item in extends)
array[i++] = item;
return array;
}
/// <summary>
/// Optimized ToList implementation with fewer allocations.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="extends"></param>
/// <param name="count"></param>
/// <returns></returns>
public static List<T> ToList<T>(this IEnumerable<T> extends, int count)
{
if (extends == null)
throw new ArgumentNullException("extends");
if (count < 0)
throw new ArgumentOutOfRangeException("count");
List<T> list = new List<T>(count);
list.AddRange(extends);
return list;
}
/// <summary>
/// Returns the sequence as an index:value dictionary.
/// </summary>