2010-09-11 23 views

Respuesta

28
int[] result = "158,141,90,86".Split(',').Select(int.Parse).ToArray(); 
17

como no, con LINQ:

int[] array = s.Split(',') 
       .Select(x => int.Parse(x)) 
       .ToArray(); 

Tenga en cuenta que que lanzará una excepción si cualquier elemento del texto no es un entero. Si desea que sea más resistente (si se trata de datos ingresados ​​por el usuario, por ejemplo) deberá usar int.TryParse; en ese punto la vida se vuelve un poco más complicada en términos de la consulta LINQ.

EDIT: Para hacer que analiza a un int?[] (con un valor nulo correspondiente a cada subcadena no válido) se podría hacer algo como:

int?[] array = s.Split(',') 
       .Select(x => { 
         int value; 
         return int.TryParse(x, out value) ? value : (int?)null; 
       }) 
       .ToArray(); 

Como ya he dicho, no es terriblemente agradable :(

EDITAR: En los comentarios, Dan comentó sobre la "obsesión" con el enfoque anterior en lugar de (presumiblemente) un enfoque más imperativo. En mi opinión, incluso la segunda versión menos agradable es aún más fácil de leer que la alternativa imperativa. solo se debe a la naturaleza fea de int.TryParse, que no es menos fea cuando se usa en imper código ative

Si int.TryParse devolvió int? o Tuple<bool, int> entonces sería tan fácil como la primera versión. Incluso la conversión de la forma tupla de la forma anulable sería sencillo, con una proyección adicional:

int[] array = s.Split(',') 
       .Select(x => int.TryParseTuple(x)) 
       .Select(tuple => tuple.First ? tuple.Second : (int?) null) 
       .ToArray(); 
+0

Para completar, ¿cómo cambiaría si tuviera que intentar analizar el int? –

+0

@Chloe: para hacer eso "correcto", querría cambiarlo a una matriz de '' int? '. –

+0

En su respuesta, Grif afirma que esto produce un error. Admito que no lo he probado, pero ¿quizás necesites reemplazarlo con 'return int.TryParse (x, out value)? (int?) valor: null' para que ambas ramas de su condicional tengan el mismo tipo? –

1

Una solución imprescindible supuesto, sería:

 string[] sa = s.Split(','); 
     int?[] array = new int?[sa.Length]; 
     int value; 
     for (int i = 0; i < sa.Length; i++) 
      if (int.TryParse(sa[i], out value)) 
       array[i] = value; 
      else 
       array[i] = null; 
+0

@Andrey: Ahh sí.No es mucho mejor que mi código en este caso, pero podría ser muy útil en otras situaciones. Es bueno saber que es posible. Gracias. – Grif

+0

@Grif: Hubiera sido útil haber agregado un comentario a mi respuesta para avisarme, en lugar de agregar tu propia respuesta. Lo he arreglado –

+0

@Tim Goodman: ¡Ahh bien! Tonto cómo me perdí esa solución. – Grif

1

Otra solución con LINQ/int ? [] es:

return source.Split(',') 
       .Select(x => { 
         int? value = null; 
         int parsed; 
         if (int.TryParse(x, out parsed)) { 
          value = parsed; 
         } 
         return value; 
       }) 
       .ToArray(); 
Cuestiones relacionadas