Существует несколько вариантов метода Split(). Ниже приведены две формы этого метода, ставшие наиболее часто используемыми, начиная с версии C# 1.0. public string[ ] Split(params char[ ] separator) public string[ ] Split(params char[ ] separator, int count)
В первой форме метода Split() вызывающая строка разделяется на составные части. В итоге возвращается массив, содержащий подстроки, полученные из вызы вающей строки. Символы, ограничивающие эти подстроки, передаются в массиве separator. Если массив separator пуст или ссылается на пустую строку, то в каче стве разделителя подстрок используется пробел. А во второй форме данного метода возвращается количество подстрок, определяемых параметром count.
Существует несколько форм метода Join(). Ниже приведены две формы, ставшие доступными, начиная с версии 2.0 среды .NET Framework. public static string Join(string separator, string[] value) public static string Join(string separator, string[] value, int startIndex, int count)
В первой форме метода Join() возвращается строка, состоящая из сцепляемых подстрок, передаваемых в массиве value. Во второй форме также возвращается стро ка, состоящая из подстрок, передаваемых в массиве value, но они сцепляются в опре деленном количестве count, начиная с элемента массива value[startIndex]. В обе их формах каждая последующая строка отделяется от предыдущей разделительной строкой, определяемой параметром separator.
В приведенном ниже примере программы демонстрируется применение методов Split() и Join(). // Разделить и соединить строки. using System; class SplitAndJoinDemo { static void Main() { string str = "Один на суше, другой на море."; char[] seps = {' ', '.', ',' }; // Разделить строку на части. string[] parts = str.Split(seps); Console.WriteLine("Результат разделения строки: "); for(int i=0; i < parts.Length; i++) Console.WriteLine(parts[i]); // А теперь соединить части строки. string whole = String.Join(" | ", parts); Console.WriteLine("Результат соединения строки: "); Console.WriteLine(whole); } }
Ниже приведен результат выполнения этой программы. Результат разделения строки: Один на суше другой на море Результат соединения строки: Один | на | суше | | другой | на | море
Обратите внимание на пустую строку между словами "суше" и "другой". Дело в том, что в исходной строке после слова "суше" следует запятая и пробел, как в под строке "суше, другой". Но запятая и пробел указаны в качестве разделителей. Поэтому при разделении данной строки между двумя разделителями (запятой и пробелом) оказывается пустая строка.
Существует ряд других форм метода Split(), принимающих параметр типа StringSplitOptions. Этот параметр определяет, являются ли пустые строки частью разделяемой в итоге строки. Ниже приведены все эти формы метода Split(). public string[] Split(params char[] separator,StringSplitOptions options) public string[] Split(string[] separator, StringSplitOptions options) public string[] Split(params char[] separator, int count, StringSplitOptions options) public string[] Split(string[] separator, int count, StringSplitOptions options)
В двух первых формах метода Split() вызывающая строка разделяется на части и возвращается массив, содержащий подстроки, полученные из вызывающей стро ки. Символы, разделяющие эти подстроки, передаются в массиве separator. Если массив separator пуст, то в качестве разделителя используется пробел. А в третьей и четвертой формах данного метода возвращается количество строк, ограничиваемое параметром count. Но во всех формах параметр options обозначает конкретный спо соб обработки пустых строк, которые образуются в том случае, если два разделителя оказываются рядом. В перечислении StringSplitOptions определяются только два значения: None и RemoveEmptyEntries. Если параметр options принимает значение None, то пустые строки включаются в конечный результат разделения исходной стро ки, как показано в предыдущем примере программы. А если параметр options при нимает значение RemoveEmptyEntries, то пустые строки исключаются из конечного результата разделения исходной строки.
Для того чтобы стали понятнее последствия исключения пустых строк, попробуем заменить в предыдущем примере программы строку кода string[] parts = str.Split(seps);
следующим фрагментом кода. string[] parts = str.Split(seps, StringSplitOptions.RemoveEmptyEntries);
При выполнении данной программы получится следующий результат. Результат разделения строки: Один на суше другой на море Результат соединения строки: Один | на | суше | другой | на | море
Как видите, пустая строка, появлявшаяся ранее из-за того, что после слова "суше" следовали запятая и пробел, теперь исключена.
Разделение является очень важной процедурой обработки строк, поскольку с его помощью нередко получают отдельные лексемы, составляющие исходную строку. Так, в программе ведения базы данных может возникнуть потребность разделить с помо щью метода Split() строку запроса "показать все остатки больше 100" на отдель ные части, включая подстроки "показать" и "100". В процессе разделения исключа ются разделители, поэтому в итоге получается подстрока "показать" (без начальных и конечных пробелов), а не подстрока "показать". Этот принцип демонстрируется в приведенном ниже примере программы, где строки, содержащие такие бинарные математические операции, как 10 + 5, преобразуются в лексемы, а затем эти операции выполняются и выводится конечный результат. // Преобразовать строки в лексемы. using System; class TokenizeDemo { static void Main() { string[] input = { "100 + 19", "100 / 3,3", "-3 * 9", "100 - 87" }; char[] seps = {' '}; for(int i=0; i < input.Length; i++) { // разделить строку на части string[] parts = input[i].Split(seps); Console.Write("Команда: "); for(int j=0; j < parts.Length; j++) Console.Write(parts[j] + " "); Console.Write(", результат: "); double n = Double.Parse(parts[0]); double n2 = Double.Parse(parts[2]); switch(parts[1]) { case "+": Console.WriteLine(n + n2); break; case Console.WriteLine(n - n2); break; case "*": Console.WriteLine(n * n2); break; case "/": Console.WriteLine(n / n2); break; } } } }
Вот к какому результату приводит выполнение этой программы. Команда: 100 + 19 , результат: 119 Команда: 100 / 3,3 , результат: 30,3030303030303 Команда: -3 * 9 , результат: -27 Команда: 100 - 87 , результат: 13
Начиная с версии 4.0, в среде .NET Framework стали доступными следующие до полнительные формы метода Join(). public static string Join(string separator, params object[] values) public static string Join(string separator, IEnumerable<string>[] values) public static string Join<T>(string separator, IEnumerable<T>[] values)
В первой форме рассматриваемого здесь метода возвращается строка, содержащая строковое представление объектов из массива values. Во второй форме возвращается строка, содержащая результат сцепления коллекции строк, обозначаемой параметром values. И в третьей форме возвращается строка, содержащая результат сцепления строковых представлений объектов из коллекции, обозначаемой параметром values. Во всех трех случаях каждая предыдущая строка отделяется от последующей раздели телем, определяемым параметром separator. Заполнение и обрезка строк
Иногда в строке требуется удалить начальные и конечные пробелы. Такая операция называется обрезкой и нередко требуется в командных процессорах. Например, про грамма ведения базы данных способна распознавать команду "print", но пользователь может ввести эту команду с одним иди несколькими начальными и конечными про белами. Поэтому перед распознаванием введенной команды необходимо удалить все подобные пробелы. С другой стороны, строку иногда требуется заполнить пробелами, чтобы она имела необходимую минимальную длину. Так, если подготавливается вы вод результатов в определенном формате, то каждая выводимая строка должна иметь определенную длину, чтобы сохранить выравнивание строк. Для упрощения подобных операций в C# предусмотрены соответствующие методы.
Для обрезки строк используется одна из приведенных ниже форм метода Trim(). public string Trim() public string Trim(params char[] trimChars)
В первой форме метода Trim() из вызывающей строки удаляются начальные и конечные пробелы. А во второй форме этого метода удаляются начальные и конечные вхождения в вызывающей строке символов из массива trimChars. В обеих формах возвращается получающаяся в итоге строка.
Строку можно заполнить символами слева или справа. Для заполнения строки сле ва служат такие формы метода PadLeft(). public string PadLeft(int totalWidth) public string PadLeft(int totalWidth, char paddingChar)
В первой форме метода PadLeft() вводятся пробелы с девой стороны вызывающей строки, чтобы ее общая длина стала равной значению параметра totalWidth. А во второй форме данного метода символы, обозначаемые параметром paddingChar, вво дятся с левой стороны вызывающей строки, чтобы ее общая длина стала равной зна чению параметра totalWidth. В обеих формах возвращается получающаяся в итоге строка. Если значение параметра totalWidth меньше длины вызывающей строки, то возвращается копия неизмененной вызывающей строки.
Для заполнения строки справа служат следующие формы метода PadRight(). public string PadRight(int totalWidth) public string PadRight(int totalWidth, char paddingChar)
В первой форме метода PadLeft() вводятся пробелы с правой стороны вызываю щей строки, чтобы ее общая длина стала равной значению параметра totalWidth. А во второй форме данного метода символы, обозначаемые параметром paddingChar, вводятся с правой стороны вызывающей строки, чтобы ее общая длина стала равной значению параметра totalWidth. B обеих формах возвращается получающаяся в ито ге строка. Если значение параметра totalWidth меньше длины вызывающей строки, то возвращается копия неизмененной вызывающей строки.
В приведенном ниже примере программы демонстрируются обрезка и заполнение строк. // Пример обрезки и заполнения строк. using System; class TrimPadDemo { static void Main() { string str = "тест"; Console.WriteLine("Исходная строка: " + str); // Заполнить строку пробелами слева. str = str.PadLeft(10); Console.WriteLine (" | " + str + "|"); // Заполнить строку пробелами справа, str = str.PadRight(20); Console.WriteLine("|" + str + "|"); // Обрезать пробелы. str = str.Trim(); Console.WriteLine("|" + str + "|"); // Заполнить строку символами # слева. str = str.PadLeft(10, '#'); Console.WriteLine("|" + str + "|"); // Заполнить строку символами # справа. str = str.PadRight(20, '#'); Console.WriteLine("|" + str + "|"); // Обрезать символы #. str = str.Trim('#'); Console.WriteLine("|" + str + "|"); } }