2009-04-28 16 views
18

dado una cadena a continuación:¿Es esta la mejor manera en C# para convertir una cadena delimitada en una matriz int?

string str = "1,2,3"; 

Será este el mejor extensión para convertirlo en una matriz int?

static class StringExtensions 
{ 
    public static int[] ToIntArray(this string s) 
    { 
     return ToIntArray(s, ','); 
    } 
    public static int[] ToIntArray(this string s, char separator) 
    { 
     string[] ar = s.Split(separator); 
     List<int> ints = new List<int>(); 
     foreach (var item in ar) 
     { 
      int v; 
      if (int.TryParse(item, out v)) 
       ints.Add(v); 
     } 
     return ints.ToArray(); 
    } 
} 

Respuesta

40

realmente depende de lo que quiere hacer con las cuerdas no enteros. En este momento los dejas caer en silencio. Personalmente, me gustaría que sea un error. Esto también le permite utilizar la más escueta:

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

Este enfoque es muy concisa, y arrojará una (no muy informativo) FormatException si la cadena dividida contiene todos los valores que no se puede analizar como un int:

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

Si sólo quieren dejar en silencio cualquier valor int no puede probar esto:

private static int? AsNullableInt(string s) 
{ 
    int? asNullableInt = null; 

    int asInt; 

    if (int.TryParse(s, out asInt)) 
    { 
     asNullableInt = asInt; 
    } 

    return asNullableInt; 
} 

// Example usage... 
int[] ints = str.Split(',') 
    .Select(s => AsNullableInt(s)) 
    .Where(s => s.HasValue) 
    .Select(s => s.Value) 
    .ToArray(); 
0

Se ve bien, también me lanzar una excepción si uno de los artículos no se podría convertir en lugar de fallar en silencio.

5

Esto va a explotar si uno de los elementos de la lista no analiza como int, que es probablemente mejor que no en silencio:

public static int[] ToIntArray(this string value, char separator) 
{ 
    return value.Split(separator).Select(i => int.Parse(i)).ToArray(); 
} 
Cuestiones relacionadas