web-dev-qa-db-fra.com

couper toutes les chaînes dans un tableau

J'ai une chaîne qui vient comme:

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

Je veux le diviser en un tableau de chaînes

Si je fais ça:

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 cela (soit une meilleure façon d'analyser ou une façon de couper toutes les chaînes dans un tableau)?

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

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

string email = "[email protected], [email protected], [email protected]";    
string[] emails = email.Replace(" ", "").Split(',');
36
nick2083
emails.Split(',').Select(email => email.Trim()).ToArray()
213
Bryan Watts

L'un ou l'autre des éléments suivants fonctionnerait. Je recommanderais le premier car il exprime plus précisément la chaîne de jonction.

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

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();
10
skalb

Utilisation Regex.Split pour éviter de couper

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

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

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

Alternativement, vous pouvez diviser en utilisant une expression régulière du formulaire:

\s*,\s*

c'est à dire.

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

Il consommera directement les espaces environnants.

Les expressions régulières sont généralement un problème de performances, 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 petit tableau.

1
Jan Zich

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

Notez également son extensibilité si vous lisez un fichier et 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.

string[] fileBData = File.ReadAllLines( sFileB ).Select( line =>
                             line.Substring( 0, 21 ).Trim()).ToArray();

Bien que ma réponse aurait dû être publiée sous forme de commentaire, je n'ai pas encore assez de points de réputation pour commenter. Mais j'ai trouvé cette discussion inestimable pour trouver comment masser les données lors de l'utilisation de ReadAllLines ().

1
RonSanderson

Si vous avez juste besoin de manipuler les entrées, sans retourner le tableau:

string[] emails = text.Split(',');
Array.ForEach(emails, e => e.Trim());
0
Teodor Tite

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

0
jscharf