2009-08-31 6 views
46

J'ai une chaîne qui vient comme:couper toutes les chaînes dans un tableau

string email = "[email protected], [email protected], [email protected]"; 

Je veux diviser en un tableau de chaînes

Si je fais ceci:

string[] emails = email.Split(','); 

Je reçois des espaces devant chaque adresse e-mail (après la première):

emails[0] = "[email protected]" 
emails[1] = " [email protected]" 
emails[2] = " [email protected]" 

Quelle est la meilleure façon d'obtenir ceci (soit une meilleure façon d'analyser ou un moyen de couper toutes les chaînes dans un tableau)?

emails[0] = "[email protected]" 
emails[1] = "[email protected]" 
emails[2] = "[email protected]" 
+2

Si l'espace sera toujours là, vous pouvez l'ajouter à la division ... ie: email.Split (','); – nilamo

Répondre

24

Vous pouvez également remplacer toutes les occurrences d'espaces, et éviter ainsi la boucle foreach:

string email = "[email protected], [email protected], [email protected]";  
string[] emails = email.Replace(" ", "").Split(','); 
+7

-1 (seulement parce qu'il a été marqué comme * la * réponse) Bien que cela mette le texte requis dans le tableau, ce n'est pas l'utilisation la plus expressive de l'API disponible. –

+9

@ 280Z28: Ce n'est pas un motif de downvote. –

+6

Fonctionne bien pour cet exemple spécifique, mais ne gère pas les espaces pour les éléments résultants comme; "barre de foo, un autre élément, blah_blah". Bryan Watts a la meilleure réponse IMO. – revgum

7

Vous pouvez utiliser trim():

string email = "[email protected], [email protected], [email protected]"; 
string[] emails = email.Split(','); 
emails = (from e in emails 
      select e.Trim()).ToArray(); 
+0

Cette réponse est correcte, mais est exagérée, cette réponse a la meilleure approche: http://stackoverflow.com/questions/1355704/trim-all-strings-in-an-array/1355732#1355732 –

0

Utilisation String.Trim dans une boucle foreach, ou si vous utilisez .NET 3.5+ une déclaration LINQ.

0

Vous pouvez diviser une expression régulière de la forme:

\s*,\s* 

à savoir

string[] emails = Regex.Split(email, @"\s*,\s*"); 

Il dévorera les espaces environnants directement.

Les expressions régulières sont généralement un hit de performance, mais l'exemple que vous avez donné indique que c'est quelque chose que vous prévoyez de faire une fois dans votre code pour un tableau court.

8

Utilisez Regex.Split pour éviter parage

var emails = Regex.Split(email, @",\s*"); 
17

Soit une des façons suivantes fonctionnerait. Je recommande le premier car il exprime plus précisément la chaîne de jointure.

string[] emails = email.Split(new string[] { ", " }, StringSplitOptions.None); 
string[] emails = email.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); 
+0

+1 Je ne savais pas sur les options. En venant de Perl, je vois des regex partout. Avec les options Split est le chemin à parcourir. –

+1

+1 nous utilisons tellement LINQ que nous avons tendance à oublier que d'autres options élégantes existent. –

175
emails.Split(',').Select(email => email.Trim()).ToArray() 
+0

Et si vous ne voulez pas que Linq soit une dépendance ... – Moismyname

+2

@Moismyname: Je ne suis pas sûr de la contrainte qui vous mènerait vers ce chemin, mais il y a d'autres réponses qui répondent à votre question. –

+0

Nice et propre. Travaillé parfaitement pour moi. Merci! – CrazyPaste

5

Vous pouvez utiliser une solution d'une ligne comme celle-ci:

string[] emails = text.Split(',', StringSplitOptions.RemoveEmptyEntries); 
Array.ForEach<string>(emails, x => emails[Array.IndexOf<string>(emails, x)] = x.Trim()); 
1

La réponse de Bryan Watts est simple et élégante. Il fait implicitement référence au tableau de chaînes créé par Split().

Notez également son extensibilité si vous lisez un fichier et que vous souhaitez masser les données lors de la création d'un tableau.

string sFileA = @"C:\Documents and Settings\FileA.txt"; 
string sFileB = @"C:\Documents and Settings\FileB.txt"; 

// Trim extraneous spaces from the first file's data 
string[] fileAData = (from line in File.ReadAllLines(sFileA) 
         select line.Trim()).ToArray(); 

// Strip a second unneeded column from the second file's data 
string[] fileBData = (from line in File.ReadAllLines(sFileB) 
         select line.Substring(0, 21).Trim()).ToArray(); 

Bien sûr, vous pouvez utiliser la notation Linq => si vous préférez. Bien que ma réponse aurait dû être publiée en tant que commentaire, je n'ai pas encore assez de points de réputation pour commenter.Mais j'ai trouvé cette discussion inestimable pour comprendre comment masser les données tout en utilisant ReadAllLines().

+0

Wecome à [SO]. Un petit point sur votre code: Si vous utilisez Linq comme ça, vous feriez mieux d'utiliser 'File.ReadLines'. 'ReadAllLines'" slurps "le fichier entier dans un tableau en mémoire, ce qui peut évidemment être problématique avec de gros fichiers. ReadLines ne lit qu'une ligne à la fois, ce qui est super si vous n'avez pas besoin de conserver la version initiale du contenu. – RoadieRich

+0

Merci! Je peux voir que l'exemple utilisant ReadAllLines se décomposera pour de très gros fichiers, contenant à la fois les données brutes et les versions découpées en mémoire en même temps, pour un instant. La page de documentation pour File.ReadLines() a également un exemple qui correspond à cette discussion. – RonSanderson

Questions connexes