HOWTO · Csharp

Convertir String Array a Int Array en C#

En esta guía, aprenderemos cómo convertir un array de cadenas en un array int en C#.

En esta página

Esta guía muestra cómo convertir un array de string en un array de int en C#. Como cada elemento llega como texto, cada valor debe analizarse para convertirlo en un entero. Tres patrones cubren la tarea: Array.ConvertAll, una proyección LINQ Select con int.Parse, y la misma proyección respaldada por int.TryParse para entradas que podrían no analizarse correctamente.

Convertir un array de cadenas con Array.ConvertAll

Array.ConvertAll aplica una función de conversión a cada elemento de un array de origen y devuelve un nuevo array del tipo de destino. Pasar el grupo de métodos int.Parse como convertidor analiza cada cadena en una sola instrucción.

Ejecute este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

using System;

class Program {
  static void Main() {
    string[] temp_str = new string[] { "1000", "2000", "3000" };
    int[] temp_int = Array.ConvertAll(temp_str, int.Parse);

    foreach (int num in temp_int) {
      Console.WriteLine(num);
    }
  }
}
1000
2000
3000

El resultado es un nuevo int[]; el string[] original permanece sin cambios. Array.ConvertAll es una buena opción predeterminada cuando todos los elementos deben convertirse de la misma forma y no se necesita ninguna proyección adicional. Dado que int.Parse realiza la conversión, cada elemento debe ser un entero bien formado dentro del rango de Int32, y las reglas de análisis descritas en las secciones siguientes también se aplican aquí.

Convertir un array de cadenas con LINQ Select y int.Parse

El método Select de LINQ proyecta cada elemento de la secuencia de origen a través de una función. Select(int.Parse) produce un IEnumerable<int> en lugar de un array, por lo que ToArray es necesario para materializar los resultados en un int[]. Esta forma encaja de manera natural cuando la conversión forma parte de una canalización LINQ más larga, como filtrar valores antes de analizarlos.

Ejecute este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

using System;
using System.Linq;

class Program {
  static void Main() {
    string[] temp_str = new string[] { "1000", "2000", "3000" };
    int[] temp_int = temp_str.Select(int.Parse).ToArray();

    foreach (int num in temp_int) {
      Console.WriteLine(num);
    }
  }
}
1000
2000
3000

Tenga en cuenta que Select es diferido: no se analiza nada hasta que se enumera la secuencia, y ToArray realiza esa enumeración exactamente una vez. int.Parse es estricto: produce una FormatException cuando un valor no es numérico y una OverflowException cuando queda fuera del rango de Int32. Los dos patrones anteriores comparten ese comportamiento, que es lo que aborda el tercer enfoque.

Controlar valores no válidos con int.TryParse

int.TryParse devuelve un bool en lugar de producir una excepción, por lo que tolera valores que no se pueden analizar, y escribe el número analizado en un parámetro out que la lambda expone como result. Dentro de Select, la lambda devuelve el valor analizado cuando la operación tiene éxito y un valor alternativo elegido en caso contrario. El programa siguiente sustituye por 0 cualquier valor que no se pueda analizar:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

using System;
using System.Linq;

class Program {
  static void Main() {
    string[] temp_str = new string[] { "1000", "abc", "3000" };
    int[] temp_int = temp_str.Select(s => int.TryParse(s, out int result) ? result : 0).ToArray();

    foreach (int num in temp_int) {
      Console.WriteLine(num);
    }
  }
}
1000
0
3000

Elija el valor alternativo de forma deliberada: un 0 sustituido es indistinguible de un 0 genuino en el resultado. Si esa ambigüedad es inaceptable, registre los fallos por separado: filtre los valores no analizados, use un valor centinela como -1 o recopile las cadenas problemáticas para el registro.

Para elegir rápidamente entre los patrones, use Array.ConvertAll cuando solo se necesita una conversión directa de una sola llamada, Select con int.Parse cuando la conversión forma parte de una canalización LINQ, y int.TryParse cuando la entrada no es de confianza y un valor alternativo documentado es aceptable.