Convierte cadena a int en una línea de código usando LINQ

Tengo una matriz de enteros en forma de cadena:

var arr = new string[] { "1", "2", "3", "4" }; 

Necesito una matriz de enteros ‘reales’ para impulsarlo aún más:

 void Foo(int[] arr) { .. } 

Traté de lanzar int y, por supuesto, falló:

 Foo(arr.Cast.ToArray()); 

Puedo hacer lo siguiente:

 var list = new List(arr.Length); arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better? Foo(list.ToArray()); 

o

 var list = new List(arr.Length); arr.ForEach(i => { int j; if (Int32.TryParse(i, out j)) // TryParse is faster, yeah { list.Add(j); } } Foo(list.ToArray()); 

pero ambos se ven feos.

¿Hay otras formas de completar la tarea?

Dado un conjunto, puede usar el método Array.ConvertAll :

 int[] myInts = Array.ConvertAll(arr, s => int.Parse(s)); 

Gracias a Marc Gravell por señalar que se puede omitir el lambda, obteniendo una versión más corta que se muestra a continuación:

 int[] myInts = Array.ConvertAll(arr, int.Parse); 

Una solución LINQ es similar, excepto que necesitaría la llamada ToArray adicional para obtener una matriz:

 int[] myInts = arr.Select(int.Parse).ToArray(); 

EDITAR: para convertir a matriz

 int[] asIntegers = arr.Select(s => int.Parse(s)).ToArray(); 

Esto debería funcionar:

 var asIntegers = arr.Select(s => int.Parse(s)); 

Para evitar excepciones con .Parse , aquí hay algunas alternativas .TryParse .

Para usar solo los elementos que se pueden analizar:

 string[] arr = { null, " ", " 1 ", " 002 ", "3.0" }; int i = 0; var a = (from s in arr where int.TryParse(s, out i) select i).ToArray(); // a = { 1, 2 } 

o

 var a = arr.SelectMany(s => int.TryParse(s, out i) ? new[] { i } : new int[0]).ToArray(); 

Alternativas que usan 0 para los elementos que no se pueden analizar:

 int i; var a = Array.ConvertAll(arr, s => int.TryParse(s, out i) ? i : 0); //a = { 0, 0, 1, 2, 0 } 

o

 var a = arr.Select((s, i) => int.TryParse(s, out i) ? i : 0).ToArray(); 

C # 7.0 :

 var a = Array.ConvertAll(arr, s => int.TryParse(s, out var i) ? i : 0); 

simplemente puede lanzar una matriz de cadenas a la matriz int por:

 var converted = arr.Select(int.Parse) 
 var asIntegers = arr.Select(s => int.Parse(s)).ToArray(); 

Asegúrese de no obtener un IEnumerable como devolución

 var list = arr.Select(i => Int32.Parse(i));