Подтвердить что ты не робот

Обрезать все строки в массиве

У меня есть строка, которая приходит как:

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

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

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

В качестве альтернативы вы можете разделить, используя регулярное выражение формы:

\s*,\s*

то есть.

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

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

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

Ответ 8

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

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

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

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

// Strip a second unneeded column from the second file 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().

Ответ 9

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

Ответ 10

Если вам просто нужно манипулировать записями, не возвращая массив:

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