web-dev-qa-db-fra.com

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

Je suis en train de scinder une chaîne basée sur les 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 et je souhaite 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 si copié à différents endroits)?

211
user236520

Si vous appelez juste:

_string[] ssize = myStr.Split(null);
_

ou:

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

alors l'espace blanc est supposé être le caractère de division. De la page de documentation de la méthode string.Split(char[]) .

Si le paramètre separator est null ou ne contient aucun caractère, les espaces sont considérés comme des délimiteurs. Les caractères d'espacement sont définis par le standard Unicode et retournent true s'ils sont passés à la méthode Char.IsWhiteSpace .

Toujours, toujours, toujours lisez la documentation!

417
jason

Oui, il faut encore une réponse ici!

Toutes les solutions proposées jusqu'ici concernent le domaine plutôt limité de entrée canonique , à savoir: a single caractère d'espacement entre éléments (bien que la pointe de la chapeau à @cherno pour au moins mentionner le problème) . Mais je soumets que dans tous les scénarios, à l'exception des plus obscurs, le fractionnement de tous ces éléments devrait donner 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 n’importe laquelle des variantes présentées ici) ne fonctionne tout simplement pas bien à moins d’attacher l’option RemoveEmptyEntries à l’une des options suivantes:

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

Comme le montre l'illustration, le fait d'omettre l'option génère quatre résultats différents (étiquetés A, B, C et D) par rapport au résultat unique obtenu par les quatre entrées lorsque vous utilisez RemoveEmptyEntries:

String.Split vs Regex.Split

Bien sûr, si vous n'aimez pas utiliser les options, utilisez simplement l'alternative regex :-)

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

Selon le documentation :

Si le paramètre separator est null ou ne contient aucun caractère, les espaces sont considérés comme des délimiteurs. Les caractères d'espacement sont définis par le standard Unicode et renvoient true s'ils sont transmis à la méthode Char.IsWhiteSpace.

Il suffit donc d'appeler myStr.Split(); Il n'est pas nécessaire de transmettre quoi que ce soit car séparateur est un tableau params.

42
ageektrapped

Pourquoi n'utilisez-vous pas ?:

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

Notez que les espaces adjacents NE seront PAS traités comme un seul délimiteur, même si vous utilisez String.Split(null). Si l'un de vos jetons est séparé par plusieurs espaces ou onglets, vous obtiendrez des chaînes vides retournées dans votre tableau.

De la documentation:

Chaque élément de séparateur définit un caractère de délimitation distinct. Si deux délimiteurs sont adjacents ou si un délimiteur est trouvé au début ou à la fin de cette instance, l'élément de tableau correspondant contient la valeur Vide.

3
cherno

Donc, ne pas copier et coller! Extrayez une fonction pour faire votre division et réutilisez-la.

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

La réutilisation de code est votre ami.

2
Tim Rogers

Pourquoi ne fais-tu pas ça:

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

Il semble qu'il existe une méthode String.ToCharArray() dans .NET 4.0!

EDIT: Comme VMAtm l’a fait remarquer, la méthode existait déjà dans .NET 2.0!

1
Daren Thomas

Si le problème est de répéter le même code, écrivez une méthode d'extension sur la classe String qui encapsule la logique de fractionnement.

1
Xhalent

Vous pouvez juste faire:

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

MSDN a plus d'exemples et de références:

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

0
Tom Gullen

Tu ne peux pas le faire en ligne?

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

Sinon, si vous faites souvent la même chose, vous pouvez toujours créer une constante ou quelque chose contenant ce tableau de caractères.

Comme d'autres l'ont noté, vous pouvez également utiliser null ou un tableau vide, selon la documentation. Lorsque vous faites cela, il utilisera automatiquement les caractères d'espacement.

var sizes = subject.Split(null);
0
Svish