La mejor forma de especificar espacios en blanco en una operación String.Split

Estoy dividiendo una cadena basada en espacios en blanco de la siguiente manera:

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

Es molesto definir la matriz char [] en todas partes de mi código. Quiero hacer esto. ¿Hay una forma más eficiente que no requiera la creación de la matriz de caracteres (que es propensa a error si se copia en diferentes lugares)?

Si solo llamas:

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

o:

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

luego se supone que el espacio en blanco es el carácter de división. Desde la página de documentación del método string.Split(char[]) .

Si el parámetro separador es null o no contiene caracteres, se supone que los espacios en blanco son los delimitadores. Los caracteres de espacio en blanco están definidos por el estándar Unicode y devuelven true si se pasan al método Char.IsWhiteSpace .

Siempre, siempre, siempre lea la documentación!

Sí, ¡hay necesidad de una respuesta más aquí!

Hasta el momento, todas las soluciones abordan el dominio bastante limitado de la entrada canónica , a saber: un único carácter de espacio en blanco entre los elementos (aunque la punta del sombrero para @cherno al menos para mencionar el problema). Pero presento que en todos los escenarios menos en los más oscuros, dividir todos estos debería arrojar resultados idénticos:

 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 (en cualquiera de los sabores mostrados a lo largo de las otras respuestas aquí) simplemente no funciona bien a menos que adjunte la opción RemoveEmptyEntries con cualquiera de estos:

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

Como se muestra en la ilustración, al omitir la opción se obtienen cuatro resultados diferentes (etiquetados como A, B, C y D) frente al resultado único de las cuatro entradas cuando utiliza RemoveEmptyEntries :

String.Split vs Regex.Split

Por supuesto, si no te gusta usar opciones, solo usa la alternativa de expresiones regulares 🙂

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

De acuerdo con la documentación :

Si el parámetro separador es nulo o no contiene caracteres, se supone que los espacios en blanco son los delimitadores. Los caracteres de espacio en blanco están definidos por el estándar Unicode y devuelven verdadero si se pasan al método Char.IsWhiteSpace.

Así que solo llame a myStr.Split(); No es necesario pasar nada porque el separador es una matriz de params .

¿Por qué no usas ?:

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

Tenga en cuenta que los espacios en blanco adyacentes NO se tratarán como un único delimitador, incluso cuando se utiliza String.Split(null) . Si alguno de tus tokens está separado con múltiples espacios o tabs, obtendrás cadenas vacías devueltas en tu matriz.

De la documentación:

Cada elemento del separador define un carácter delimitador por separado. Si dos delimitadores son adyacentes, o se encuentra un delimitador al principio o al final de esta instancia, el elemento de matriz correspondiente contiene Vacío.

¡Así que no copie y pegue! Extraiga una función para dividirla y reutilizarla.

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

La reutilización del código es tu amigo.

¿Por qué no haces esto?

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

¡Parece que hay un método String.ToCharArray() en .NET 4.0!

EDITAR: Como VMAtm ha señalado, ¡ el método ya existía en .NET 2.0!

Puedes hacer:

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

MSDN tiene más ejemplos y referencias:

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

¿No puedes hacerlo en línea?

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

De lo contrario, si hace esto exactamente a menudo, siempre puede crear constante o algo que contenga esa matriz de caracteres.

Como otros han notado, de acuerdo con la documentación también puede usar null o una matriz vacía. Cuando lo haga, utilizará los espacios en blanco de forma automática.

 var sizes = subject.Split(null); 

Si el problema es repetir el mismo código, escriba un método de extensión en la clase String que encapsula la lógica de división.