2010-02-10 5 views
50

¿Cuál es la forma más fácil de analizar una lista de valores de cadenas delimitadas por comas en algún tipo de objeto que pueda recorrer, para que pueda acceder fácilmente a los valores individuales?¿La manera más fácil de analizar una cadena delimitada por comas para algún tipo de objeto que pueda recorrer para acceder a los valores individuales?

ejemplo de cadena: "0, 10, 20, 30, 100, 200"

yo soy un poco nuevo en C#, por lo que me perdone por hacer una pregunta tan simple como este. Gracias.

+0

re: mi respuesta - si está hecho el tratamiento de estos números, así como a continuación hay estrategias adicionales para analizarlos de una manera tolerante a fallas si está interesado. Empecé a agregarlos, pero sentí que en realidad era demasiada información. –

+0

en realidad sí, los necesitaba como #s pero lo implementé en este momento, fue fácil después de seguir su código. Todo funciona bien ¡Gracias! – ycomp

Respuesta

123

hay trampas con esto - pero en última instancia, la forma más sencilla será utilizar

string s = [yourlongstring]; 
string[] values = s.Split(','); 

Si el nu mbre de comas y las entradas no es importante, y usted quiere deshacerse de los valores 'vacíos', puede utilizar

string[] values = s.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 

Una cosa, sin embargo - esto mantendrá ningún espacio en blanco antes y después de sus cadenas. Se puede usar un poco de magia para resolver LINQ que:

string[] values = s.Split(',').Select(sValue => sValue.Trim()).ToArray(); 

Eso es si está usando .Net 3.5 y tiene la declaración using System.Linq en la parte superior del archivo fuente.

+0

, debe tenerse en cuenta que también hay disponible una solución de expresiones regulares que también podría hacer frente a los espacios en blanco en cualquier lado. Pero este es el enfoque más directo. –

+1

añadiendo al comentario de @Andras.También usaría la expresión regular para asegurarme de que cada valor sea numérico y quite otros. ¿Patrón? '" (? \ d +) "', luego puede obtenerlo en cada 'Match.Groups [" value "]'. Podrías convertirlos a enteros sobre la marcha mientras lo haces también. –

+1

He adaptado algunos de estos para crear la Lista userIds = usersList.Split (','). Seleccionar (sValue => long.Parse (sValue.Trim())). ToList(); – Manish

17
var stringToSplit = "0, 10, 20, 30, 100, 200"; 

// To parse your string 
    var elements = test.Split(new[] 
    { ',' }, System.StringSplitOptions.RemoveEmptyEntries); 

// To Loop through 
    foreach (string items in elements) 
    { 
     // enjoy 
    } 
+1

buena solución simple. –

6

Use Linq, es una manera muy rápida y fácil.

string mystring = "0, 10, 20, 30, 100, 200"; 

var query = from val in mystring.Split(',') 
      select int.Parse(val); 
foreach (int num in query) 
{ 
    Console.WriteLine(num); 
} 
+0

try 'int.Parse (val.Trim())' –

+3

¿No es un poco excesivo usar Linq para esto? .split() devuelve una matriz a la que puedes simplemente hacer un bucle. Está agregando la complejidad de Linq, sin ningún beneficio real. En todo caso, se reduce la legibilidad. –

+0

pero es fácil entender lo que está sucediendo y el compilador traduce la consulta de la misma manera a un árbol de expresiones como si usara lambda-querys – martin

4

El patrón coincide con todos los caracteres que no sean dígitos. Esto te restringirá a enteros no negativos, pero para tu ejemplo será más que suficiente.

string input = "0, 10, 20, 30, 100, 200"; 
Regex.Split(input, @"\D+"); 
2

veces las columnas tendrán comas dentro de sí mismos, tales como:

"Un cierto artículo", "Otro elemento", "Además, un elemento más"

En estos casos, la división en "" romperá algunas columnas. Tal vez una forma más fácil, pero acabo de hacer mi propio método (como un bono, se ocupa de los espacios después de las comas y devuelve un IList):

private IList<string> GetColumns(string columns) 
{ 
    IList<string> list = new List<string>(); 

    if (!string.IsNullOrWhiteSpace(columns)) 
    { 
     if (columns[0] != '\"') 
     { 
      // treat as just one item 
      list.Add(columns); 
     } 
     else 
     { 
      bool gettingItemName = true; 
      bool justChanged = false; 
      string itemName = string.Empty; 

      for (int index = 1; index < columns.Length; index++) 
      { 
       justChanged = false; 
       if (subIndustries[index] == '\"') 
       { 
        gettingItemName = !gettingItemName; 
        justChanged = true; 
       } 

       if ((gettingItemName == false) && 
       (justChanged == true)) 
       { 
        list.Add(itemName); 
        itemName = string.Empty; 
        justChanged = false; 
       } 

       if ((gettingItemName == true) && (justChanged == false)) 
       { 
        itemName += columns[index]; 
       } 
      } 
     } 
    } 

    return list; 
} 
Cuestiones relacionadas