Primero comprueba si la fuente es ICollection<T>
, en cuyo caso puede llamar al método ToArray()
de la fuente.
De lo contrario, enumera la fuente exactamente una vez. Como lo enumera, almacena elementos en una matriz de almacenamiento intermedio. Cada vez que llega al final de la matriz de almacenamiento intermedio, crea un nuevo almacenamiento intermedio de dos veces el tamaño y copia en los elementos antiguos. Una vez que la enumeración finaliza, devuelve el búfer (si tiene el tamaño exacto) o copia los elementos del búfer en una matriz del tamaño correcto exacto.
Así es código de pseudo-fuente para la operación de:
public static T[] ToArray<T>(this IEnumerable<T> source)
{
T[] items = null;
int count = 0;
foreach (T item in source)
{
if (items == null)
{
items = new T[4];
}
else if (items.Length == count)
{
T[] destinationArray = new T[count * 2];
Array.Copy(items, 0, destinationArray, 0, count);
items = destinationArray;
}
items[count] = item;
count++;
}
if (items.Length == count)
{
return items;
}
T[] destinationArray = new TElement[count];
Array.Copy(items, 0, destinationArray, 0, count);
return destinationArray;
}
Mi sugerencia sería descargar .NET Reflector y ver la fuente por ti mismo. –
@Justin _o_ simplemente usando la fuente de referencia de Framework de Microsoft. Tienden a tener comentarios y nombres de variables más agradables en ellos :-) Es lo que solía investigar mi respuesta. – driis