935 votes

Le moyen le plus simple de séparer une chaîne de caractères sur les nouvelles lignes en .net ?

J'ai besoin de diviser une chaîne de caractères en nouvelles lignes dans .NET et le seul moyen que je connaisse pour diviser les chaînes de caractères est la méthode Split. Cependant, cette méthode ne me permet pas de diviser (facilement) une chaîne sur une nouvelle ligne. Quelle est la meilleure façon de procéder ?

3 votes

Pourquoi ne le ferait-elle pas ? Il suffit de diviser sur System.Environment.NewLine

17 votes

Mais vous devez l'envelopper dans une chaîne[] et ajouter un argument supplémentaire et... c'est juste un peu lourd.

1632voto

Guffa Points 308133

Pour diviser sur une chaîne de caractères, vous devez utiliser la surcharge qui prend un tableau de chaînes de caractères :

string[] lines = theText.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);

Edit :
Si vous souhaitez traiter différents types de sauts de ligne dans un texte, vous pouvez utiliser la possibilité de faire correspondre plus d'une chaîne. Cela permettra d'effectuer un découpage correct sur l'un ou l'autre type de saut de ligne et de préserver les lignes vides et l'espacement dans le texte :

string[] lines = theText.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);

0 votes

Je m'en doutais. Aussi, vous avez besoin d'un autre argument StringSplitOptions là-dedans. J'espérais juste qu'il y avait un moyen moins encombrant de le faire.

0 votes

Déplacez le clunk dans votre propre méthode - éventuellement dans votre propre classe StringUtils.

3 votes

@RCIX : Envoyer les bons paramètres à la méthode est un peu gênant car vous l'utilisez pour quelque chose de beaucoup plus simple que ce dont elle est capable. Au moins, c'est là, avant le framework 2, vous deviez utiliser une expression régulière ou construire votre propre routine de fractionnement pour fractionner une chaîne...

147voto

Clément Points 1439

Et si vous utilisiez un StringReader ?

using (System.IO.StringReader reader = new System.IO.StringReader(input)) {
    string line = reader.ReadLine();
}

15 votes

C'est mon préféré. J'ai enveloppé dans une méthode d'extension et le rendement retourne la ligne actuelle : gist.github.com/ronnieoverby/7916886

4 votes

C'est la seule solution non-regex que j'ai trouvée pour .netcf 3.5.

9 votes

C'est particulièrement intéressant lorsque l'entrée est grande et que la copie de tout dans un tableau devient lente ou gourmande en mémoire.

59voto

nikmd23 Points 5780

Vous devriez être capable de diviser votre chaîne assez facilement, comme ceci :

aString.Split(Environment.NewLine.ToCharArray());

50 votes

Sur un système non-*nix, cela se fera sur les caractères séparés de la chaîne Newline, c'est-à-dire les caractères CR et LF. Cela entraînera une chaîne vide supplémentaire entre chaque ligne.

0 votes

Corrigez-moi si je me trompe, mais cela ne va-t-il pas se diviser sur les caractères \ et n ?

8 votes

@RCIX : Non, le \r et \n représentent des caractères uniques. La chaîne " \r\n " est composé de deux caractères, et non de quatre.

27voto

Erwin Mayer Points 3427

En se basant sur la réponse de Guffa, dans une classe d'extension, utiliser :

public static string[] Lines(this string source) {
    return source.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
}

11voto

Colonel Panic Points 18390

Pour une variable de type chaîne de caractères s :

s.Split(new string[]{Environment.NewLine},StringSplitOptions.None)

Cela utilise la définition des fins de ligne de votre environnement. Sous Windows, les fins de ligne sont CR-LF (retour chariot, saut de ligne) ou les caractères d'échappement de C#. \r\n .

C'est une solution fiable, car si vous recombinez les lignes avec String.Join ce qui équivaut à votre chaîne originale :

var lines = s.Split(new string[]{Environment.NewLine},StringSplitOptions.None);
var reconstituted = String.Join(Environment.NewLine,lines);
Debug.Assert(s==reconstituted);

Ce qu'il ne faut pas faire :

  • Utilisez StringSplitOptions.RemoveEmptyEntries car cela briserait des balises telles que Markdown, où les lignes vides ont une fonction syntaxique.
  • Séparation sur le séparateur new char[]{Environment.NewLine} car sous Windows, cela créera un élément de chaîne vide pour chaque nouvelle ligne.

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