2011-07-18 14 views
6

Sto cercando di analizzare la stringa e vedere se il valore dopo ":" è intero. Se non è intero, rimuovere "Test: M" dalla stringa.Aiuto con l'analisi delle stringhe

Ecco la stringa di esempio che ho.

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

Il risultato Ho bisogno 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

Puoi fornire altri esempi di input previsti e l'output atteso? –

+4

Perché non implementare la logica inversa? Se il valore è un numero intero, lo si aggiunge alla stringa del risultato. – Alexandre

+0

@Alexandre: esattamente quello che ho proposto. La modifica di una 'stringa' sarà lenta man mano che la' stringa' diventa grande. L'uso di un 'StringBuilder' finirà per essere più veloce alla fine. – Yuck

risposta

4

Si potrebbe continuare con la struttura looping, ma io, personalmente, come il look di LINQ un po 'meglio:

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 se correggi questi errori. – Groo

+0

@Groo - Cos'altro mi manca? –

+0

Credo una parola chiave 'out'. Inoltre, il dummy 'outVar' potrebbe essere estratto dal lambda, ma non è un errore, solo un modo per semplificare il corpo del lambda. – Groo

5

Ci siamo quasi. Provare a utilizzare questo:

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(); 

EDIT: Aggiunta del "," per mantenere la virgola nell'output ...

EDIT: Cattura @Groo suggerimento su evitando implicito concatenazione di stringhe.

+0

Probabilmente è necessario aggiungere anche le virgole. –

+0

@Tim Coker: Sì! Mi sono quasi perso, grazie. – Yuck

+2

Dato che si utilizza un 'StringBuilder', si potrebbe anche scrivere' builder.Append (','); 'in una riga separata, per evitare concatenazioni non necessarie. Inoltre, ci sarà una virgola alla fine della stringa risultante, quindi un 'String.Join' potrebbe essere una soluzione migliore del tutto. – 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

Credo che l'OP voglia mantenere i dati di stringa come output. La tua risposta invia il testo alla console. – Yuck

2

si può solo costruire una nuova collezione con i valori desiderati ...

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 Non ero a conoscenza del fatto che si trattasse di un vincolo nel dominio del problema degli OP, ma ho comunque aggiornato l'esempio. –

0

dovrei avvertire che non hanno strumenti di codifica sulle mie mani, quindi non è in grado di fornire con codice compilabile chiaramente, ma in altri differenza Vorrei suggerire di usare Split (stri ng []), ad esempio: Split (nuova stringa [] {",", ":"}) ed evita la chiamata split 2 volte. Dopodiché otterrai una chiara visione degli indici dell'array che sono interi. Nel tuo esempio DOVREBBE essere ogni N * 3. A proposito, devi testarlo.

Spero che questo aiuti.

Saluti.