обрезать все строки в массиве - PullRequest
58 голосов
/ 31 августа 2009

У меня есть строка, которая выглядит как:

string email = "a@a.com, b@b.com, c@c.com";

Я хочу разбить его на массив строк

Если я сделаю это:

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

Я получаю пробелы перед каждым адресом электронной почты (после первого):

emails[0] = "a@a.com"
emails[1] = " b@b.com"
emails[2] = " c@c.com"

Каков наилучший способ получить это (лучший способ анализа или способ обрезки всех строк в массиве)?

emails[0] = "a@a.com"
emails[1] = "b@b.com"
emails[2] = "c@c.com"

Ответы [ 9 ]

211 голосов
/ 31 августа 2009
emails.Split(',').Select(email => email.Trim()).ToArray()
34 голосов
/ 31 августа 2009

Вы также можете заменить все вхождения пробелов, поэтому избегайте цикла foreach:

string email = "a@a.com, b@b.com, c@c.com";    
string[] emails = email.Replace(" ", "").Split(',');
20 голосов
/ 31 августа 2009

Любой из следующих будет работать. Я бы порекомендовал первое, так как оно более точно выражает присоединяющуюся строку.

string[] emails = email.Split(new string[] { ", " }, StringSplitOptions.None);
string[] emails = email.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
10 голосов
/ 31 августа 2009

Вы можете использовать Trim ():

string email = "a@a.com, b@b.com, c@c.com";
string[] emails = email.Split(',');
emails = (from e in emails
          select e.Trim()).ToArray();
8 голосов
/ 31 августа 2009

Используйте Regex.Split, чтобы избежать обрезки

var emails = Regex.Split(email, @",\s*");
5 голосов
/ 10 февраля 2011

Вы можете использовать однолинейное решение, например:

string[] emails = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
Array.ForEach<string>(emails, x => emails[Array.IndexOf<string>(emails, x)] = x.Trim());
1 голос
/ 17 марта 2016

Ответ Брайана Уоттса элегантен и прост. Он неявно ссылается на массив строк, созданный Split ().

Также обратите внимание на его расширяемость, если вы читаете файл и хотите скомбинировать данные при построении массива.

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

Конечно, вы можете использовать запись Linq =>, если хотите.

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

Хотя мой ответ должен был быть опубликован в качестве комментария, у меня пока недостаточно репутации, чтобы комментировать. Но я нашел это обсуждение неоценимым в выяснении, как массировать данные при использовании ReadAllLines ().

1 голос
/ 31 августа 2009

Кроме того, вы можете разделить с помощью регулярного выражения в форме:

\s*,\s*

т.е.

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

Он будет поглощать окружающие пространства напрямую.

Регулярные выражения обычно снижают производительность, но приведенный вами пример показывает, что вы планируете сделать это один раз в своем коде для короткого массива.

0 голосов
/ 31 августа 2009

Используйте String.Trim в цикле foreach или, если вы используете .NET 3.5+, оператор LINQ.

...