282 votes

Meilleure façon de spécifier des espaces dans une opération String.Split

Je partage une chaîne basée sur des espaces comme suit:

 string myStr = "The quick brown fox jumps over the lazy dog";

char[] whitespace = new char[] { ' ', '\t' };
string[] ssizes = myStr.Split(whitespace);
 

Il est fastidieux de définir le tableau char [] partout dans mon code, je veux le faire. Existe-t-il un moyen plus efficace qui ne nécessite pas la création du tableau de caractères (qui est sujet aux erreurs s'il est copié à différents endroits)?

534voto

Jason Points 125291

Si vous appelez:

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

ou:

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

ensuite, espace blanc est supposé être le fractionnement du personnage. De la string.Split(char[]) méthode est la page de documentation.

Si le séparateur paramètre null ou ne contient pas de caractères, les caractères d'espacement sont supposés être les délimiteurs. White-space personnages sont définis par le standard Unicode et retour true s'ils sont passés à l' Char.IsWhiteSpace méthode.

Toujours, toujours, toujours lire la documentation!

255voto

Michael Sorens Points 9637

Oui, Il est nécessaire pour une réponse de plus ici!

Toutes les solutions jusqu'ici adresse le peu d'domaine de canonique d'entrée, à savoir: un seul caractère espace entre les éléments (mais coup de chapeau à @cherno pour au moins mentionner le problème). Mais je soutiens que, dans l'ensemble, mais la plus obscure des scénarios, le fractionnement de la totalité de ces doit à des résultats identiques:

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 (dans toutes les saveurs montré à travers les autres réponses ici) ne fonctionne tout simplement pas bien à moins que vous attachez de l' RemoveEmptyEntries option avec l'un de ces:

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

Comme l'illustration révèle, en omettant l'option rendements quatre des résultats différents (appelées A, B, C, et D) contre le seul résultat de tous les quatre entrées lorsque vous utilisez RemoveEmptyEntries:

String.Split vs Regex.Split

Bien sûr, si vous n'aimez pas l'aide des options, il suffit d'utiliser la regex alternative :-)

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

48voto

ageektrapped Points 7815

Selon la documentation :

Si le séparateur paramètre est null ou ne contient pas de caractères, les caractères d'espacement sont supposés être les délimiteurs. White-space personnages sont définis par le standard Unicode et retourne true si ils sont passés à l'Omble chevalier.IsWhiteSpace méthode.

Donc, juste appelez - myStr.Split(); Il n'y a pas besoin de passer à quelque chose parce que le séparateur est un params tableau.

13voto

Reniuz Points 5951

Pourquoi vous n'utilisez pas ?:

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

3voto

cherno Points 180

Notez que les espaces adjacents ne seront PAS traités comme un seul délimiteur, même lors de l'utilisation d' String.Split(null). Si l'un de vos jetons sont séparés par de multiples espaces ou des tabulations, vous obtiendrez les cordes à vide est retourné dans votre tableau.

À partir de la documentation:

Chaque élément de séparateur définit un distinct caractère délimiteur. Si deux délimiteurs sont adjacents, ou un délimiteur se trouve au début ou à la fin de cet exemple, l'élément de tableau correspondant contient Vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X