Melhor maneira de especificar espaços em branco em uma operação String.Split

Estou dividindo uma string com base no espaço em branco da seguinte forma:

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

É cansativo definir o array char [] em todos os lugares no meu código que eu quero fazer isso. Existe uma maneira mais eficiente que não requer a criação da matriz de caracteres (que é propensa a erros se copiada em locais diferentes)?

Se você acabou de ligar:

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

ou:

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

então, o espaço em branco é considerado o caractere de divisão. A partir da página de documentação do método string.Split(char[]) .

Se o parâmetro separador for null ou não contiver nenhum caractere, os caracteres de espaço em branco serão considerados os delimitadores. Os caracteres de espaço em branco são definidos pelo padrão Unicode e retornam true se forem transmitidos para o método Char.IsWhiteSpace .

Sempre, sempre, sempre leia a documentação!

Sim, há necessidade de mais uma resposta aqui!

Todas as soluções até agora abordam o domínio bastante limitado da input canônica , a saber: um único caractere de espaço em branco entre os elementos (embora a ponta do chapéu seja @cherno para pelo menos mencionar o problema). Mas afirmo que, em todos os cenários, exceto os mais obscuros, a divisão de todos eles deve produzir 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 (em qualquer um dos sabores mostrados em todas as outras respostas aqui) simplesmente não funciona bem, a menos que você anexe a opção RemoveEmptyEntries com um destes:

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

Como a ilustração revela, omitir a opção produz quatro resultados diferentes (rotulados A, B, C e D) versus o resultado único de todas as quatro inputs quando você usa RemoveEmptyEntries :

String.Split vs Regex.Split

Claro, se você não gosta de usar opções, basta usar a alternativa regex 🙂

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

Segundo a documentação :

Se o parâmetro separador for nulo ou não contiver nenhum caractere, os caracteres de espaço em branco serão considerados os delimitadores. Os caracteres de espaço em branco são definidos pelo padrão Unicode e retornam true se forem transmitidos para o método Char.IsWhiteSpace.

Então, basta chamar myStr.Split(); Não há necessidade de passar nada porque o separador é um array de params .

Por que você não usa?

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

Observe que os espaços em branco adjacentes NÃO serão tratados como um único delimitador, mesmo quando se usa String.Split(null) . Se algum de seus tokens for separado por vários espaços ou tabulações, você receberá strings vazias em sua matriz.

Da documentação:

Cada elemento do separador define um caractere delimitador separado. Se dois delimitadores forem adjacentes ou um delimitador for encontrado no início ou no final dessa instância, o elemento da matriz correspondente conterá Vazio.

Então não copie e cole! Extraia uma function para fazer sua divisão e reutilizá-la.

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

A reutilização de código é sua amiga.

Por que você não faz isso:

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

Parece que existe um método String.ToCharArray() no .NET 4.0!

EDIT: Como o VMAtm apontou, o método já existia no .NET 2.0!

Você pode apenas fazer:

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

O MSDN tem mais exemplos e referências:

http://msdn.microsoft.com/pt-br/library/b873y76a.aspx

Você não pode fazê-lo inline?

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

Caso contrário, se você fizer exatamente isso, sempre poderá criar constante ou algo que contenha essa matriz de caracteres.

Como outros notaram que você pode, de acordo com a documentação, também usar null ou um array vazio. Quando você faz isso, ele usa os caracteres do espaço em branco automaticamente.

 var sizes = subject.Split(null); 

Se a repetição do mesmo código for o problema, escreva um método de extensão na class String que encapsule a lógica de divisão.