2011-07-18 9 views
6

Estoy tratando de analizar la cadena y ver si el valor después de ":" es Entero. Si no es un número entero, elimine "Prueba: M" de la cadena.Ayuda con el análisis de Cadena

Aquí está el ejemplo de cadena que tengo.

string testString = "Test:34,Test:M"; 

El resultado necesito testString = "Test:34"

string[] data = testString.Split(','); 
for (int i = 0; i < data.Length; i++) 
{ 
    string[] data1 = data[i].Split(':'); 
    int num = 0; 
    if(Int32.TryParse(data1[1], out num)) 
    { 

    } 
} 
+0

¿Puede dar más ejemplos de la entrada esperada y la salida esperada? –

+4

¿Por qué no implementa la lógica inversa? Si el valor es un número entero, añádelo a la cadena de resultados. – Alexandre

+0

@Alexandre: Exactamente lo que propuse. La modificación de una 'cadena' va a ser lenta ya que la 'cadena' se vuelve grande. Usar un 'StringBuilder' terminará siendo más rápido al final. – Yuck

Respuesta

4

Usted podría continuar con la estructura de bucle pero yo, personalmente, me gusta el aspecto de LINQ un poco mejor:

var dummy = 0; 

var intStrings = 
    testString.Split(',') 
     .Where(s => s.Contains(":") && int.TryParse(s.Split(':')[1], out dummy)) 
     .ToArray(); 

var result = String.Join(",", intStrings); 
+0

+1 si soluciona esos errores. – Groo

+0

@Groo - ¿Qué más me estoy perdiendo? –

+0

Creo una palabra clave 'out'. Además, el dummy 'outVar' podría extraerse de la lambda, pero eso no es un error, solo una forma de simplificar el cuerpo de la lambda. – Groo

5

Ya casi ha terminado. Trate de usar esto:

var builder = new StringBuilder(); 
    string[] data = testString.Split(','); 
    for (int i = 0; i < data.Length; i++) 
    { 
     string[] data1 = data[i].Split(':'); 
     int num = 0; 
     if(Int32.TryParse(data1[1], out num)) 
     { 
      builder.Append(data[i]); 
      buidler.Append(','); 
     } 
    } 

    testString = builder.ToString(); 

EDITAR: Adición de la "," para mantener la coma en la salida ...

EDITAR: Tomando @Groo sugerencia sobre cómo evitar la concatenación de cadenas implícita.

+0

Probablemente necesites agregar las comas también. –

+0

@Tim Coker: ¡Sí! Casi me perdí eso, gracias. – Yuck

+2

Dado que está utilizando un 'StringBuilder', también puede escribir' builder.Append (','); 'en una línea separada, para evitar concatenaciones innecesarias. Además, habrá una coma al final de la cadena resultante, por lo que un 'String.Join' podría ser una mejor solución. – Groo

1
 string testString = "Test:34,Test:M,Crocoduck:55"; 
     string[] data = testString.Split(','); 
     for (int i = 0; i < data.Length; i++) 
     { 
      string s = data[i].Remove(0, data[i].IndexOf(':') + 1); 
      int num; 
      if (Int32.TryParse(s, out num)) 
      { 
       Console.WriteLine(num); 
      } 
     } 
+0

Creo que OP quiere mantener los datos de cadena como salida. Tu respuesta arroja texto a la consola. – Yuck

2

Se podía construir una nueva colección con los valores deseados ...

string testString = "Test:34,Test:M, 23:test"; 

int temp = default(int); 

var integerLines = from line in testString.Split(',') 
        let value = line.Split(':').ElementAt(1) 
        let isInteger = Int32.TryParse(value, out temp) 
        where isInteger 
        select line; 
+0

@Groo No sabía que era una restricción en el dominio del problema de PO, pero actualicé el ejemplo de todos modos. –

0

debo advertir que no tiene la herramienta de codificación en mis manos, por lo que no se le puede proporcionar código claramente compilables, pero en diferencia de otros, yo sugeriría usar de Split (STRI ng []), por ejemplo: Split (nueva cadena [] {",", ":"}) y evita la división de llamadas 2 veces. Después de esto obtendrás una vista clara de los índices de la matriz que son enteros. En tu ejemplo, DEBERÍA ser cada N * 3. Necesitas probarlo, por cierto.

Espero que esto ayude.

Atentamente.