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)?
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 retournenttrue
s'ils sont passés à la méthodeChar.IsWhiteSpace
.
Toujours, toujours, toujours lisez la documentation!
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
:
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)
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
.
Pourquoi n'utilisez-vous pas ?:
string[] ssizes = myStr.Split(' ', '\t');
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.
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.
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!
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.
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:
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);