2009-12-29 4 views
42

oggi mi chiedevo se c'è una soluzione migliore eseguire il seguente codice di esempio.Eseguire Trim() durante l'utilizzo di Split()

string keyword = " abc, foo ,  bar"; 
string match = "foo"; 
string[] split= keyword.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); 
foreach(string s in split) 
{ 
    if(s.Trim() == match){// asjdklasd; break;} 
} 

C'è un modo per eseguire trim() senza iterare manualmente attraverso ogni elemento? Sto cercando qualcosa come 'dividi i seguenti caratteri e taglia automaticamente ogni risultato'.

Ah, subito prima di inviare l'ho trovato

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList(); 

in How can I split and trim a string into parts all on one line?

Ancora Sono curioso: Potrebbe esserci una soluzione migliore per questo? (O sarebbe il compilatore probabilmente convertirli alla stessa uscita codice come il Linq-operazione?)

+0

definiscono "migliore" ... vuoi dire più leggibile? Più veloce? – Ragepotato

+0

Più veloce/più performante senza perdere la leggibilità. Come l'anser di Marc Gravell. – citronas

risposta

68

Un'altra opzione possibile (che evita LINQ, nel bene e nel male):

string line = " abc, foo ,  bar"; 
string[] parts= Array.ConvertAll(line.Split(','), p => p.Trim()); 

Tuttavia, se solo bisogno di sapere se è lì - forse corto circuito?

bool contains = line.Split(',').Any(p => p.Trim() == match); 
+0

Oh, sì, hai assolutamente ragione. Sembra che devo abituarmi al metodo Any();) grazie – citronas

+3

La risposta in http://stackoverflow.com/questions/1728303/how-can-i-split-and-trim-a-string- in-parti-all-on-one-line è più elegante forse? –

3

Io suggerirei di usare le espressioni regolari sulla stringa originale, alla ricerca del modello "un qualsiasi numero di spazi seguiti da uno dei vostri delimitatori seguito da uno o più spazi" e rimuovere quegli spazi. Quindi dividi.

+0

Regex, non ci ho pensato neanche io, ma hai ragione, sarebbe un'altra possibile soluzione. grazie – citronas

+1

Sarei molto contrario all'utilizzo di espressioni regolari per un problema così insignificante. Vedi http://www.codinghorror.com/blog/archives/001016.html riguardo "ora hai due problemi". – Eilon

+0

Beh, sono senza speranza nella scrittura di espressioni regolari e rovinerei tutto, quindi non lo userei né TBH, ma questo sembra un modello abbastanza semplice da cercare e sostituire e avrei pensato sarebbe stato più veloce di qualsiasi metodo che fa un .Trim() su ogni elemento dopo la divisione. – MikeW

1

Troverai molti metodi diversi per fare questo e il cambiamento delle prestazioni e la precisione non saranno prontamente evidenti. Consiglierei di inserirli tutti in una suite di test come NUnit in modo da trovare sia uno che esce sopra E quali sono accurati.

Utilizzare piccole, medie e grandi quantità di testo nei cicli per esaminare le varie situazioni.

3

Prova questo:

string keyword = " abc, foo ,  bar"; 
string match = "foo"; 
string[] split = Regex.Split(keyword.Trim(), @"\s*[,;]\s*"); 
if (split.Contains(match)) 
{ 
    // do stuff 
} 
3

Se gli spazi appena circonda le parole nella stringa separato da virgole questo funzionerà:

var keyword = " abc, foo ,  bar"; 
var array = keyword.Replace(" ", "").Split(','); 
if (array.Contains("foo")) 
{ 
    Debug.Print("Match"); 
} 
+1

omg, non ci ho pensato neanche io. oggi non era il mio giorno =) – citronas

+2

Questa soluzione non funziona se un singolo valore contiene 1 o più spazi. – Franck

1
var parts = line.Split(';').Select(p => p.Trim()).Where(p => !string.IsNullOrWhiteSpace(p)).ToArray();