Выбрать главу

Рассмотрим примеры применения этих методов. В первом из них строка представляет сложноподчиненное предложение, которое разбивается на простые предложения. Во втором предложение разделяется на слова. Затем производится обратная сборка разобранного текста. Вот код соответствующей процедуры:

public void TestSplitAndJoin()

{

    string txt = "А это пшеница, которая в темном чулане

       хранится," +" в доме, который построил Джек!";

    Console.WriteLine("txt={0}", txt);

    Console.WriteLine("Разделение текста на простые предложения: ");

    string[] SimpleSentences, Words;

    //размерность массивов SimpleSentences и Words

    //устанавливается автоматически в соответствии с

    //размерностью массива, возвращаемого методом

    Split SimpleSentences = txt.Split (',');

    for (int i=0;i< SimpleSentences.Length; i + +)

        Console.WriteLine("SimpleSentences[{0}]= {1}",

             i, SimpleSentences[i]);

    string txtjoin = string.Join(",",SimpleSentences);

    Console.WriteLine("txtj oin={0 } ", txtjоin);

    Words = txt.Split (',', ' ');

    for (int i=0;i< Words.Length; i ++)

         Console.WriteLine("Words[{0}]= {1}",i, Words[i]);

    txtjoin = string.Join(" ",Words);

    Console.WriteLine("txtjoin={0}", txtjоin);

}//TestSplitAndJoin

Результаты выполнения этой процедуры показаны на рис. 14.3.

Рис. 14.3. Разбор и сборка строки текста

Обратите внимание, что методы Split и Join хорошо работают, когда при разборе используется только один разделитель. В этом случае сборка действительно является обратной операцией и позволяет восстановить исходную строку. Если же при разборе задается некоторое множество разделителей, то возникают две проблемы:

• невозможно при сборке восстановить строку в прежнем виде, поскольку не сохраняется информация о том, какой из разделителей был использован при разборе строки. Поэтому при сборке между элементами вставляется один разделитель, возможно, состоящий из нескольких символов;

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

Если при разборе предложения на слова использовать в качестве разделителя только пробел, то пустые слова не появятся, но запятая будет являться частью некоторых слов.

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

Динамические методы класса String

Операции, разрешенные над строками в С#, разнообразны. Методы этого класса позволяют выполнять вставку, удаление, замену, поиск вхождения подстроки в строку. Класс String наследует методы класса Object, частично их переопределяя. Класс String наследует и, следовательно, реализует методы четырех интерфейсов: IComparable, ICloneable, IConvertible, IEnumerable. Три из них уже рассматривались при описании классов-массивов.

Рассмотрим наиболее характерные методы при работе со строками.

Сводка методов, приведенная в таблице 14.2, дает достаточно полную картину широких возможностей, имеющихся при работе со строками в С#. Следует помнить, что класс String является неизменяемым. Поэтому Replace, Insert и другие методы представляют собой функции, возвращающие новую строку в качестве результата и не изменяющие строку, вызвавшую метод.

Таблица 14.2. Динамические методы и свойства класса String

Метод ∙ Описание

Insert ∙ Вставляет подстроку в заданную позицию

Remove ∙ Удаляет подстроку в заданной позиции

Replace ∙ Заменяет подстроку в заданной позиции на новую подстроку

Substring ∙ Выделяет подстроку в заданной позиции

IndexOf, IndexOfAny, LastlndexOf, LastlndexOfAny ∙ Определяются индексы первого и последнего вхождения заданной подстроки или любого символа из заданного набора