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