Il modo migliore per specificare spazi bianchi in un’operazione String.Split

Sto dividendo una stringa basata su spazi bianchi come segue:

string myStr = "The quick brown fox jumps over the lazy dog"; char[] whitespace = new char[] { ' ', '\t' }; string[] ssizes = myStr.Split(whitespace); 

È fastidioso definire l’array char [] ovunque nel mio codice, voglio farlo. C’è un modo più efficace che non richieda la creazione dell’array di caratteri (che è sobject ad errori se copiato in posti diversi)?

Se solo chiami:

 string[] ssize = myStr.Split(null); 

o:

 string[] ssize = myStr.Split(new char[0]); 

quindi si suppone che lo spazio bianco sia il carattere di divisione. Dalla pagina di documentazione del metodo string.Split(char[]) .

Se il parametro separatore è null o non contiene caratteri, si presume che i caratteri spazio bianco siano i delimitatori. I caratteri spazi bianchi sono definiti dallo standard Unicode e restituiscono true se vengono passati al metodo Char.IsWhiteSpace .

Sempre, sempre, leggi sempre la documentazione!

Sì, c’è bisogno di un’altra risposta qui!

Tutte le soluzioni finora affrontano il dominio piuttosto limitato dell’input canonico , con: un singolo carattere di spaziatura tra gli elementi (sebbene punta del cappello a @cherno per menzionare almeno il problema). Ma sottolineo che in tutti gli scenari tranne quelli più oscuri, suddividere tutti questi dati dovrebbe produrre risultati identici:

 string myStrA = "The quick brown fox jumps over the lazy dog"; string myStrB = "The quick brown fox jumps over the lazy dog"; string myStrC = "The quick brown fox jumps over the lazy dog"; string myStrD = " The quick brown fox jumps over the lazy dog"; 

String.Split (in uno qualsiasi degli aromi mostrati nelle altre risposte qui) semplicemente non funziona bene a meno che non si allega l’opzione RemoveEmptyEntries con uno di questi:

 myStr.Split(new char[0], StringSplitOptions.RemoveEmptyEntries) myStr.Split(new char[] {' ','\t'}, StringSplitOptions.RemoveEmptyEntries) 

Come mostra l’illustrazione, omettendo l’opzione si ottengono quattro risultati diversi (etichettati A, B, C e D) rispetto al singolo risultato di tutti e quattro gli input quando si utilizza RemoveEmptyEntries :

String.Split vs Regex.Split

Ovviamente, se non ti piace usare le opzioni, usa l’alternativa regex 🙂

 Regex.Split(myStr, @"\s+").Where(s => s != string.Empty) 

Secondo la documentazione :

Se il parametro separatore è nullo o non contiene caratteri, si presume che i caratteri spazio bianco siano i delimitatori. I caratteri spazi bianchi sono definiti dallo standard Unicode e restituiscono true se vengono passati al metodo Char.IsWhiteSpace.

Quindi chiama myStr.Split(); Non è necessario passare nulla perché il separatore è un array params .

Perché non usi ?:

 string[] ssizes = myStr.Split(' ', '\t'); 

Tieni presente che lo spazio String.Split(null) adiacente NON verrà considerato come un delimitatore singolo, anche quando si utilizza String.Split(null) . Se uno dei tuoi token è separato da più spazi o tab, otterrai stringhe vuote restituite nell’array.

Dalla documentazione:

Ogni elemento del separatore definisce un carattere delimitatore separato. Se due delimitatori sono adiacenti o un delimitatore viene trovato all’inizio o alla fine di questa istanza, l’elemento dell’array corrispondente contiene Empty.

Quindi non copiare e incollare! Estrai una funzione per dividerla e riutilizzala.

 public static string[] SplitWhitespace (string input) { char[] whitespace = new char[] { ' ', '\t' }; return input.Split(whitespace); } 

Il riutilizzo del codice è tuo amico.

Perché non lo fai solo:

 var ssizes = myStr.Split(" \t".ToCharArray()); 

Sembra che ci sia un metodo String.ToCharArray() in .NET 4.0!

EDIT: Come VMAtm ha sottolineato, il metodo esisteva già in .NET 2.0!

Puoi solo fare:

 string myStr = "The quick brown fox jumps over the lazy dog"; string[] ssizes = myStr.Split(' '); 

MSDN ha più esempi e riferimenti:

http://msdn.microsoft.com/en-us/library/b873y76a.aspx

Non puoi farlo in linea?

 var sizes = subject.Split(new char[] { ' ', '\t' }); 

Altrimenti, se fai spesso questa cosa esatta, potresti sempre creare una costante o qualcosa che contenga quel char array.

Come altri hanno notato, è ansible, secondo la documentazione, utilizzare anche una matrice vuota o vuota. Quando lo farai, userà automaticamente i caratteri dello spazio bianco.

 var sizes = subject.Split(null); 

Se il problema riguarda la ripetizione dello stesso codice, scrivere un metodo di estensione sulla class String che incapsula la logica di suddivisione.