Convertir una cadena de enteros separados por comas en una matriz int

Solo encontré una forma de hacerlo al revés: crear una cadena separada por comas de una lista int o matriz, pero no de cómo convertir una entrada como string str = "1,2,3,4,5"; a una matriz o lista de ints.

Aquí está mi implementación (inspirada en esta publicación de Eric Lippert ):

  public static IEnumerable StringToIntList(string str) { if (String.IsNullOrEmpty(str)) { yield break; } var chunks = str.Split(',').AsEnumerable(); using (var rator = chunks.GetEnumerator()) { while (rator.MoveNext()) { int i = 0; if (Int32.TryParse(rator.Current, out i)) { yield return i; } else { continue; } } } } 

¿Crees que este es un buen enfoque o hay un camino más fácil, incluso construido?

EDITAR: Perdón por cualquier confusión, pero el método necesita manejar entradas inválidas como "1,2,,,3" o "###, 5," etc. omitiéndolas.

Deberías usar un ciclo foreach, como este:

 public static IEnumerable StringToIntList(string str) { if (String.IsNullOrEmpty(str)) yield break; foreach(var s in str.Split(',')) { int num; if (int.TryParse(s, out num)) yield return num; } } 

Tenga en cuenta que, al igual que su publicación original, esto ignorará los números que no pudieron ser analizados.

Si desea lanzar una excepción si no se puede analizar un número, puede hacerlo mucho más simplemente con LINQ:

 return (str ?? "").Split(',').Select(int.Parse); 

Si no desea tener el comportamiento actual de manejo de errores, es realmente fácil:

 return text.Split(',').Select(x => int.Parse(x)); 

De lo contrario, usaría un método de ayuda extra (como se ve esta mañana) :

 public static int? TryParseInt32(string text) { int value; return int.TryParse(text, out value) ? value : (int?) null; } 

y:

 return text.Split(',').Select(TryParseInt32) .Where(x => x.HasValue) .Select(x => x.Value); 

o si no desea usar la conversión de grupo de métodos:

 return text.Split(',').Select(t => t.TryParseInt32(t) .Where(x => x.HasValue) .Select(x => x.Value); 

o en forma de expresión de consulta:

 return from t in text.Split(',') select TryParseInt32(t) into x where x.HasValue select x.Value; 

Sin usar una función lambda y solo para entradas válidas, creo que es más claro hacer esto:

 Array.ConvertAll(value.Split(','), Convert.ToInt32); 

–EDIT– Parece que tomé su encabezado de pregunta demasiado literalmente – él estaba pidiendo una serie de entradas en lugar de una lista –EDIT ENDS–

Sin embargo, otro método de ayuda …

 private static int[] StringToIntArray(string myNumbers) { List myIntegers = new List(); Array.ForEach(myNumbers.Split(",".ToCharArray()), s => { int currentInt; if (Int32.TryParse(s, out currentInt)) myIntegers.Add(currentInt); }); return myIntegers.ToArray(); } 

código de prueba rápida para ello, también …

 static void Main(string[] args) { string myNumbers = "1,2,3,4,5"; int[] myArray = StringToIntArray(myNumbers); Console.WriteLine(myArray.Sum().ToString()); // sum is 15. myNumbers = "1,2,3,4,5,6,bad"; myArray = StringToIntArray(myNumbers); Console.WriteLine(myArray.Sum().ToString()); // sum is 21 Console.ReadLine(); } 

Esto se ha preguntado antes. .Net tiene una función ConvertAll incorporada para convertir una matriz de un tipo a una matriz de otro tipo. Puede combinar esto con Split para separar la cadena de una serie de cadenas

Función de ejemplo:

  static int[] ToIntArray(this string value, char separator) { return Array.ConvertAll(value.Split(separator), s=>int.Parse(s)); } 

Tomado de aquí

Esto es por mucho tiempo, pero puedes modificarlo fácilmente para trabajar con Ints.

 private static long[] ConvertStringArrayToLongArray(string str) { return str.Split(",".ToCharArray()).Select(x => long.Parse(x.ToString())).ToArray(); } 

No veo por qué sacar al enumerador explícitamente le ofrece alguna ventaja sobre el uso de un foreach . Tampoco es necesario llamar AsEnumerable en chunks .

Me gusta una solución simple que funcionó para mí.

String.Join(",",str.Split(','));

Creo que es lo suficientemente bueno. Está claro, es flojo, así que será rápido (excepto tal vez el primer caso cuando se divide la cadena).

 import java.util.*; import java.io.*; public class problem { public static void main(String args[])enter code here { String line; String[] lineVector; int n,m,i,j; Scanner sc = new Scanner(System.in); line = sc.nextLine(); lineVector = line.split(","); //enter the size of the array n=Integer.parseInt(lineVector[0]); m=Integer.parseInt(lineVector[1]); int arr[][]= new int[n][m]; //enter the array here System.out.println("Enter the array:"); for(i=0;i 

En la primera línea ingrese el tamaño de la matriz separada por una coma. Luego ingrese los valores en la matriz separados por una coma. El resultado se almacena en la matriz arr. por ejemplo, entrada: 2,3 1,2,3 2,4,6 almacenará valores como arr = {{1,2,3}, {2,4,6}};