Лучший способ указать пробелы в операции String.Split

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

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

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

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

Ответ 1

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

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

или

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

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

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

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

Ответ 2

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

Все решения до сих пор затрагивают довольно ограниченную область канонического ввода, а именно: одиночный пробельный символ между элементами (хотя наконечник шляпы для @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)

Как видно из иллюстрации, при использовании RemoveEmptyEntries:

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

String.Split vs Regex.Split

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

Regex.Split(myStr, @"\s+").Where(s => s != string.Empty)

Ответ 3

В соответствии с документацией:

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

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

Ответ 4

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

string[] ssizes = myStr.Split(' ', '\t');

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 8

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

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

Ответ 9

Вы не можете сделать это inline?

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

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

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

var sizes = subject.Split(null);

Ответ 10

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