Добавить в цитаты Настройки чтения

Страница 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>           &quot;100 + 19&quot;,</b>

<b>           &quot;100 / 3.3&quot;,</b>

<b>           &quot;-3 * 9&quot;,</b>

<b>           &quot;100 - 87&quot;</b>

<b>           };</b>

<b>    char[] seps = { ' ' };</b>

<b>    for (int i = 0; i &lt; input.Length; i++) {</b>

<b>      // разделить строку на части</b>

<b>      string[] parts = input[i].Split(seps);</b>

<b>      Console.Write(&quot;Команда: &quot;);</b>

<b>      for (int j = 0; j &lt; parts.Length; j++)</b>

<b>        Console.Write(parts[j] + &quot; &quot;);</b>

<b>      Console.Write(&quot;, результат: &quot;);</b>

<b>      double n = Double.Parse(parts[0]);</b>

<b>      double n2 = Double.Parse(parts[2]);</b>

<b>      switch (parts[1]) {</b>

<b>        case &quot;+&quot;:</b>

<b>        Console.WriteLine(n + n2);</b>

<b>          break;</b>

<b>        case &quot;-&quot;:</b>

<b>        Console.WriteLine(n - n2);</b>

<b>          break;</b>

<b>        case &quot;*&quot;:</b>

<b>        Console.WriteLine(n * n2);</b>

<b>          break;</b>

<b>        case &quot;/&quot;:</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&lt;string&gt;[] values)</b>

<b>public static string Join&lt;T&gt;(string separator, IEnumerable&lt;T&gt;[] values)</b>

В первой форме рассматриваемого здесь метода возвращается строка, содержащая строковое представление объектов из массива values. Во второй форме возвращается строка, содержащая результат сцепления коллекции строк, обозначаемой параметром values. И в третьей форме возвращается строка, содержащая результат сцепления строковых представлений объектов из коллекции, обозначаемой параметром values. Во всех трех случаях каждая предыдущая строка отделяется от последующей разделителем, определяемым параметром separator.