Лучший способ указать пробелы в операции 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);
}
Повторное использование кода - ваш друг.
Ответ 7
Почему бы вам просто не сделать это:
var ssizes = myStr.Split(" \t".ToCharArray());
Кажется, есть метод String.ToCharArray()
в .NET 4.0!
EDIT: Как указал VMAtm, метод уже существовал в .NET 2.0!
Ответ 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, который инкапсулирует логику расщепления.