Лучший способ указать пробел в операции String.Split - PullRequest
207 голосов
/ 24 мая 2011

Я разбиваю строку на основе пробелов следующим образом:

string myStr = "The quick brown fox jumps over the lazy dog";

char[] whitespace = new char[] { ' ', '\t' };
string[] ssizes = myStr.Split(whitespace);

Утомительно определять массив char [] везде в моем коде. Я хочу сделать это.Есть ли более эффективный способ, который не требует создания массива символов (который подвержен ошибкам при копировании в разные места)?

Ответы [ 10 ]

414 голосов
/ 24 мая 2011

Если вы просто позвоните:

string[] ssize = myStr.Split(null);

или:

string[] ssize = myStr.Split(new char[0]);

, то пробел считается символом разделения.Со страницы документации метода string.Split(char[]) .

Если параметр разделителя равен null или не содержит символов, пробелами считаются разделители,Пробельные символы определяются стандартом Unicode и возвращают true, если они передаются методу Char.IsWhiteSpace.

Всегда, всегда, всегда читайте документацию!

178 голосов
/ 23 августа 2013

Да, здесь нужен еще один ответ!

Все решения на данный момент направлены на довольно ограниченную область канонического ввода , а именно: одиночный символ пробела между элементами (хотя наконечник шляпы @cherno для по крайней мере упоминания проблемы). Но я утверждаю, что во всех, кроме самых неясных сценариев, разделение всех этих должно дать идентичные результаты:

string myStrA = "The quick brown fox jumps over the lazy dog";
string myStrB = "The  quick  brown  fox  jumps  over  the  lazy  dog";
string myStrC = "The quick brown fox      jumps over the lazy dog";
string myStrD = "   The quick brown fox jumps over the lazy dog";

String.Split (в любом из вариантов, показанных в других ответах здесь) просто не работает должным образом, если вы не добавите параметр RemoveEmptyEntries к одному из следующих вариантов:

myStr.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)
myStr.Split(new char[] {' ','\t'}, StringSplitOptions.RemoveEmptyEntries)

Как показано на рисунке, если вы не укажете эту опцию, вы получите четыре разных результата (обозначенные A, B, C и D) по сравнению с одним результатом для всех четырех входов при использовании RemoveEmptyEntries:

String.Split vs Regex.Split

Конечно, если вам не нравится использование опций, просто используйте альтернативу регулярному выражению: -)

Regex.Split(myStr, @"\s+").Where(s => s != string.Empty)
42 голосов
/ 24 мая 2011

Согласно документации :

Если параметр разделителя имеет значение null или не содержит символов, пробелами считаются пробелы. Пробельные символы определяются стандартом Unicode и возвращают значение true, если они передаются методу Char.IsWhiteSpace.

Так что просто позвоните myStr.Split(); Нет необходимости передавать что-либо, потому что разделитель - это массив params.

11 голосов
/ 24 мая 2011

Почему вы не используете ?:

string[] ssizes = myStr.Split(' ', '\t');
3 голосов
/ 30 января 2013

Обратите внимание, что соседние пробелы НЕ будут рассматриваться как один разделитель, даже при использовании String.Split(null).Если какой-либо из ваших токенов разделен несколькими пробелами или табуляциями, вы получите пустые строки, возвращенные в ваш массив.

Из документации:

Каждый элемент разделителя определяет отдельныйразделитель символа.Если два разделителя являются смежными или в начале или конце этого экземпляра найден разделитель, соответствующий элемент массива содержит значение Empty.

2 голосов
/ 24 мая 2011

Так что не копируйте и не вставляйте!Извлеките функцию для разделения и используйте ее снова.

public static string[] SplitWhitespace (string input)
{
    char[] whitespace = new char[] { ' ', '\t' };
    return input.Split(whitespace);
}

Повторное использование кода - ваш друг.

1 голос
/ 24 мая 2011

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

1 голос
/ 24 мая 2011

Почему бы вам просто не сделать это:

var ssizes = myStr.Split(" \t".ToCharArray());

Кажется, есть метод String.ToCharArray() в .NET 4.0!

РЕДАКТИРОВАТЬ: Как указал VMAtm, метод уже существовал в .NET 2.0!

0 голосов
/ 24 мая 2011

Разве вы не можете сделать это встроенным?

var sizes = subject.Split(new char[] { ' ', '\t' });

В противном случае, если вы делаете именно это часто, вы всегда можете создать константу или что-то, содержащее этот массив символов.

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

var sizes = subject.Split(null);
0 голосов
/ 24 мая 2011

Вы можете просто сделать:

string myStr = "The quick brown fox jumps over the lazy dog";
string[] ssizes = myStr.Split(' ');

MSDN имеет больше примеров и ссылок:

http://msdn.microsoft.com/en-us/library/b873y76a.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...