Para que sea lo más limpio posible, me gusta dejar que el compilador haga todo el trabajo. No hay moldes (por lo que es realmente seguro). No se utilizan bibliotecas de terceros (System.Linq) (Sin sobrecarga de tiempo de ejecución).
public static IEnumerable<T> GetEnumerable<T>(this T[] arr)
{
return arr;
}
// Y para usar el código:
String[] arr = new String[0];
arr.GetEnumerable().GetEnumerator()
Esto se aprovecha de un poco de magia compilador que mantiene todo limpio.
El otro punto a tener en cuenta es que mi respuesta es la única respuesta que hará la verificación en tiempo de compilación.
Para cualquiera de las otras soluciones, si el tipo de "arr" cambia, el código de llamada se compilará y fallará en el tiempo de ejecución, lo que dará como resultado un error en el tiempo de ejecución.
Mi respuesta hará que el código no se compile y, por lo tanto, tengo menos posibilidades de enviar un error en mi código, ya que me indicaría que estoy usando un tipo incorrecto.
El código LINQy en realidad devuelve un enumerador para el resultado del método Cast, en lugar de un enumerador para la matriz ... – Guffa
Guffa: dado que los enumeradores proporcionan solo acceso de solo lectura, no hay una gran diferencia en términos de uso. –
Como implica @Mehrdad, el uso de 'LINQ/Cast' tiene un comportamiento de tiempo de ejecución bastante diferente, ya que ** todos y cada uno de los elementos de la matriz ** se pasarán a través de un conjunto adicional de recorridos 'MoveNext' y' Current' round-trips, y esto podría afectar el rendimiento si la matriz es enorme. En cualquier caso, el problema se puede evitar completa y fácilmente obteniendo el enumerador adecuado en primer lugar (es decir, utilizando uno de los dos métodos que se muestran en mi respuesta). –