2010-06-02 24 views
62

Tengo una función (tointarray) para convertir una cadena en una matriz de entradas, pero no estoy muy satisfecho con ella. Hace el trabajo, pero debe haber una forma más elegante de hacerlo, y quizás LINQ podría ayudar aquí. Lamentablemente, no soy muy bueno en LINQ. ¿Hay una mejor manera?Convertir cadena a matriz int usando LINQ

Mi función:

{ 
    string s1 = "1;2;3;4;5;6;7;8;9;10;11;12"; 
    int[] ia = tointarray(s1, ';'); 
} 
int[] tointarray(string value, char sep) 
{ 
    string[] sa = value.Split(sep); 
    int[] ia = new int[sa.Length]; 
    for (int i = 0; i < ia.Length; ++i) 
    { 
     int j; 
     string s = sa[i]; 
     if (int.TryParse(s, out j)) 
     { 
      ia[i] = j; 
     } 
    } 
    return ia; 
} 

Respuesta

190

This post Hizo una pregunta similar y usó LINQ para resolverlo, quizás también lo ayude.

string s1 = "1;2;3;4;5;6;7;8;9;10;11;12"; 
int[] ia = s1.Split(';').Select(n => Convert.ToInt32(n)).ToArray(); 
+1

Yo usaría int.Parse tho. – Femaref

+0

@Femaref hace un buen punto! Gracias ... – JSprang

+4

langs.Split (';'). Seleccionar (int.Parse) .ToArray() –

17
s1.Split(';').Select(s => Convert.ToInt32(s)).ToArray(); 

no ensayadas y de la parte superior de mi cabeza ... ahora para probar la sintaxis correcta.

Probado y todo se ve bien.

+1

no puedes hacer: 's1.Split (';') Seleccionar (Convert.ToInt32) .ToArray();' – strager

+1

@strager - No, esa declaración. no compila –

+1

@strager, aparentemente no se puede con eso usando .Net 4.0. Estás soñando en Python;) –

7

Aquí está el código que filtra los campos no válidos:

var ints = from field in s1.Split(';').Where((x) => { int dummy; return Int32.TryParse(x, out dummy); }) 
       select Int32.Parse(field); 
+0

+1 Seguí desplazándome tratando de encontrar la solución equivalente al código OPs. Desafortunadamente, esto es menos eficiente ya que tiene que analizar el int dos veces. – xr280xr

15

uno realmente correcto para una aplicación es:

int n; 
int[] ia = s1.Split(';').Select(s => int.TryParse(s, out n) ? n : 0).ToArray(); 
28

Puede acortar solución JSprangs un poco mediante el uso de un grupo método en lugar :

string s1 = "1;2;3;4;5;6;7;8;9;10;11;12"; 
int[] ints = s1.Split(';').Select(int.Parse).ToArray(); 
1
public static int[] ConvertArray(string[] arrayToConvert) 
    { 
     int[] resultingArray = new int[arrayToConvert.Length]; 

     int itemValue; 

     resultingArray = Array.ConvertAll<string, int> 
      (
       arrayToConvert, 
       delegate(string intParameter) 
       { 
        int.TryParse(intParameter, out itemValue); 
        return itemValue; 
       } 
      ); 

     return resultingArray; 
    } 

Referencia:

http://codepolice.net/convert-string-array-to-int-array-and-vice-versa-in-c/