Книга: C# 4.0: полное руководство

Класс String

Класс String

Класс String определен в пространстве имен System. В нем реализуются следующие интерфейсы: IComparable, IComparable<string>, ICloneable, IConvertible, IEnumerable, IEnumerable<char> и IEquatable<string>. Кроме того, String — герметичный класс, а это означает, что он не может наследоваться. В классе String предоставляются все необходимые функциональные возможности для обработки символьных строк в С#. Он служит основанием для встроенного в C# типа string и является составной частью среды .NET Framework. В последующих разделах представлено подробное описание класса String.

Конструкторы класса String

В классе String определено несколько конструкторов, позволяющих создавать строки самыми разными способами. Для создания строки из символьного массива служит один из следующих конструкторов.

public String(char[ ] value)
public String(char[ ] value, int startlndex, int length)

Первая форма конструктора позволяет создать строку, состоящую из символов массива value. А во второй форме для этой цели из массива value извлекается определенное количество символов (length), начиная с элемента, указываемого по индексу startlndex.

С помощью приведенного ниже конструктора можно создать строку, состоящую из отдельного символа, повторяющегося столько раз, сколько потребуется:

public String(char с, int count)

где с обозначает повторяющийся символ; a count — количество его повторений.

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

public String(char* value)
public String(char* value, int startlndex, int length)

Первая форма конструктора позволяет создать строку из символов, доступных из массива по указателю value. При этом предполагается, что массив, доступный по указателю value, завершается пустым символом, обозначающим конец строки. А во второй форме конструктора для этой цели из массива, доступного по указателю value, извлекается определенное количество символов (length), начиная с элемента, указываемого по индексу startlndex. В этих конструкторах применяются указатели, поэтому их можно использовать только в небезопасном коде.

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

public String(sbyte* value)
public String(sbyte* value, int startlndex, int length)
public String(sbyte* value, int startlndex, int length, Encoding enc)

Первая форма конструктора позволяет построить строку из отдельных байтов символов, доступных из массива по указателю value. При этом предполагается, что массив, доступный по указателю value, завершается признаком конца строки. Во второй форме конструктора для этой цели из массива, доступного по указателю value, извлекается определенное количество байтов символов (length), начиная с элемента, указываемого по индексу startlndex. А третья форма конструктора позволяет указать количество кодируемых байтов. Класс Encoding находится в пространстве имен System. Text. В этих конструкторах применяются указатели, и поэтому их можно использовать только в небезопасном коде.

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

string str = "новая строка";

Поле, индексатор и свойство класса String

В классе String определено единственное поле.

public static readonly string Empty

Поле Empty обозначает пустую строку, т.е. такую строку, которая не содержит символы. Этим оно отличается от пустой ссылки типа String, которая просто делается на несуществующий объект.

Помимо этого, в классе String определен единственный индексатор, доступный только для чтения.

public char this[int index] { get; }

Этот индексатор позволяет получить символ по указанному индексу. Индексация строк, как и массивов, начинается с нуля. Объекты типа String отличаются постоянством и не изменяются, поэтому вполне логично, что в классе String поддерживается индексатор, доступный только для чтения.

И наконец, в классе String определено единственное свойство, доступное только для чтения.

public int Length { get; }

Свойство Length возвращает количество символов в строке.

Операторы класса String

В классе String перегружаются два следующих оператора: == и !=. Оператор == служит для проверки двух символьных строк на равенство. Когда оператор == применяется к ссылкам на объекты, он обычно проверяет, делаются ли обе ссылки на один и тот же объект. А когда оператор == применяется к ссылкам на объекты типа String, то на предмет равенства сравнивается содержимое самих строк. Это же относится и к оператору !=. Когда он применяется к ссылкам на объекты типа String, то на предмет неравенства сравнивается содержимое самих строк. В то же время другие операторы отношения, в том числе < и >=, сравнивают ссылки на объекты типа String таким же образом, как и на объекты других типов. А для того чтобы проверить, является ли одна строка больше другой, следует вызвать метод Compare(), определенный в классе String.

Как станет ясно дальше, во многих видах сравнения символьных строк используются сведения о культурной среде. Но это не относится к операторам == и !=. Ведь они просто сравнивают порядковые значения символов в строках. (Иными словами, они сравнивают двоичные значения символов, не видоизмененные нормами культурной среды, т.е. региональными стандартами.) Следовательно, эти операторы выполняют сравнение строк без учета регистра и настроек культурной среды.

Сравнение строк

Вероятно, из всех операций обработки символьных строк чаще всего выполняется сравнение одной строки с другой. Прежде чем рассматривать какие-либо методы сравнения строк, следует подчеркнуть следующее: сравнение строк может быть выполнено в среде .NET Framework двумя основными способами. Во-первых, сравнение может отражать обычаи и нормы отдельной культурной среды, которые зачастую представляют собой настройки культурной среды, вступающие в силу при выполнении программы. Это стандартное поведение некоторых, хотя и не всех методов сравнения. И во-вторых, сравнение может быть выполнено независимо от настроек культурной среды только по порядковым значениям символов, составляющих строку. Вообще говоря, при сравнении строк без учета культурной среды используется лексикографический порядок (и лингвистические особенности), чтобы определить, является ли одна строка больше, меньше или равной другой строке. При порядковом сравнении строки просто упорядочиваются на основании невидоизмененного значения каждого символа.

-----------------------------

ПРИМЕЧАНИЕ

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

-----------------------------

Выбор способа сравнения символьных строк представляет собой весьма ответственное решение. Как правило и без всякий исключений, следует выбирать сравнение строк с учетом культурной среды, если это делается для целей отображения результата пользователю (например, для вывода на экран ряда строк, отсортированных в лексикографическом порядке). Но если строки содержат фиксированную информацию, не предназначенную для видоизменения с учетом отличий в культурных средах, например, имя файла, ключевое слово, адрес веб-сайта или значение, связанное с обеспечением безопасности, то следует выбрать порядковое сравнение строк. Разумеется, особенности конкретного разрабатываемого приложения будут диктовать выбор подходящего способа сравнения символьных строк.

В классе String предоставляются самые разные методы сравнения строк, перечисленные в табл.22.1. Наиболее универсальным среди них является метод Compare(). Он позволяет сравнивать две строки полностью или частично, с учетом или без учета регистра, способа сравнения, определяемого параметром типа StringComparison, а также сведений о культурной среде, предоставляемых с помощью параметра типа Culturelnfo. Те перегружаемые варианты метода Compare(), которые не содержат параметр типа StringComparison, выполняют сравнение символьных строк с учетом регистра и культурной среды. А в тех перегружаемых его вариантах, которые не содержат параметр типа Culturelnfo, сведения о культурной среде определяются текущей средой выполнения. В примерах программ, приведенных в этой главе, параметр типа Culturelnfo не используется, а большее внимание уделяется использованию параметра типа StringComparison.

Таблица 22.1. Методы сравнения символьных строк

Метод - Назначение

public static int Compare(string strA, string strB) - Сравнивает строку strA со строкой strB. Возвращает положительное значение, если строка strA больше строки strB;отрицательное значение, если строка strA меньше строки strB; и нуль, если строки strA и strB равны. Сравнение выполняется с учетом регистра и культурной среды

public static int Compare(string strA, string strB,bool ignoreCase) - Сравнивает строку strA со строкой strB. Возвращает положительное значение, если строка strA больше строки strB;отрицательное значение, если строка strA меньше строки strB; и нуль, если строки strA и strB равны. Если параметр ignoreCase принимает логическое значение true, то при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Сравнение выполняется с учетом культурной среды

public static int Compare(string strA,string strB, StringComparison comparisonType) - Сравнивает строку strA со строкой strB. Возвращает положительное значение, если строка strA больше строки strB; отрицательное значение, если строка strA меньше строки strB, и нуль, если строки strA и strB равны. Параметр comparisonType определяет конкретный способ сравнения строк

public static int Compare(string strA,string strB, bool ignoreCase, Culturelnfo culture) - Сравнивает строку strA со строкой strB, используя информацию о культурной среде, определяемую параметром culture. Возвращает положительное значение, если строка strA больше строки strB; отрицательное значение, если строка strA меньше строки strB; и нуль, если строки strA и strB равны. Если параметр ignoreCase принимает логическое значение true, то при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Класс Culturelnfo определен в пространстве имен System.Globalization

public static int Compare(string strA, int indexA,string strB,int indexB, int length) - Сравнивает части строк strA и strB. Сравнение начинается со строковых элементов strA[ indexA] и strB[indexB] и включает количество символов, определяемых параметром length. Метод возвращает положительное значение, если часть строки strA больше части строки strB] отрицательное значение, если часть строки strA меньше части строки strB; и нуль, если сравниваемые части строк strA и strB равны. Сравнение выполняется с учетом регистра и культурной среды

public static int Compare(string strA, int indexA,string strB,int indexB, int length,bool ignoreCase) - Сравнивает части строк strA и strB. Сравнение начинается со строковых элементов str А[ indexA] и strB[indexB] и включает количество символов, определяемых параметром length. Метод возвращает положительное значение, если часть строки strA больше части строки strB; отрицатель ное значение, если часть строки strA меньше части строки strB; и нуль, если сравниваемые части строк strA и strB равны. Если параметр ignoreCase принимает логическое значение true, то при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Сравнение выполняется с учетом культурной среды

public static int Compare(string strA,int indexA, string strB,int indexB,int length, StringComparison comparisonType) - Сравнивает части строк strA и strB. Сравнение начинается со строковых элементов strA[ indexA] и strB[indexB] и включает количество символов, определяемых параметром length. Метод возвращает положительное значение, если часть строки strA больше части строки strB; отрицательное значение, если часть строки strA меньше части строки strB; и нуль, если сравниваемые части строк strA и strB равны. Параметр comparisonType определяет конкретный способ сравнения строк

public static int Compare(string strA,int indexA, string strB,int indexB,int length, bool ignoreCase, Culturelnfo culture) - Сравнивает части строк strA и strB, используя информацию о культурной среде, определяемую параметром culture. Сравнение начинается со строковых элементов strA[indexA] и strB[indexB] и включает количество символов, определяемых параметром length. Метод возвращает положительное значение, если часть строки strA больше части строки strB; отрицательное значение, если часть строки strA меньше части строки strB; и нуль, если сравниваемые части строк strA и strB равны. Если параметр ignoreCase принимает логическое значение true, то при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Класс Culturelnfo определен в пространстве имен System.Globalization

public static int Compare(string strAfstring strB, Culturelnfo culture, CompareOptions options) - Сравнивает строку strA со строкой strB, используя информацию о культурной среде, обозначаемую параметром culture, а также варианты сравнения, передаваемые в качестве параметра options. Возвращает положительное значение, если строка strA больше строки strB; отрицательное значение, если строка strA меньше строки strB; и нуль, если строки strA и strB равны. Классы Culturelnfo и CompareOptions определены в пространстве имен System.Globalization

public static int Compare(string strA,int indexA, string strB,int indexB,int length, Culturelnfo culture, CompareOptions options) - Сравнивает части строк strA и strB, используя информацию о культурной среде, обозначаемую параметром culture, а также варианты сравнения, передаваемые в качестве параметра options. Сравнение начинается со строковых элементов strA[ indexA] и strB[indexB] и включает количество символов, определяемых параметром length. Метод возвращает положительное значение, если часть строки strA больше части строки strB; отрицательное значение, если часть строки strA меньше части строки strB; и нуль, если сравниваемые части строк strA и strB равны. Классы Culturelnfo и CompareOptions определены в пространстве имен System.Globalization

public static int CompareOrdinal(string strA,string strB) - Сравнивает строку strAco строкой strB независимо от культурной среды, языка и региональных стандартов. Возвращает положительное значение, если строка strA больше строки strB; отрицательное значение, если строка strA меньше строки strB; и нуль, если строки strA и strB равны

public static int CompareOrdinal(string strA,int indexA, string strB,int indexB,int count) - Сравнивает части строк strA и strB независимо от культурной среды, языка и региональных стандартов. Сравнение начинает ся со строковых элементов strА[ indexA] и strB[ indexB] и включает количество символов, определяемых параметром count. Метод возвращает положительное значение, если часть строки strA больше части строки strB; отрицательное значение, если часть строки strA меньше части строки strB; и нуль, если сравниваемые части строк strA и strB равны

public int CompareTo(object value) - Сравнивает вызывающую строку со строковым представлением объекта value. Возвращает положительное значение, если вызывающая строка больше строки value; отрицательное значение, если вызывающая строка меньше строки value; и нуль, если сравниваемые строки равны

public int CompareTo(string strB) - Сравнивает вызывающую строку со строкой strB. Возвращает положительное значение, если вызывающая строка больше строки strB; отрицательное значение, если вызывающая строка меньше строки strB; и нуль, если сравниваемые строки равны

public override bool Equals(object obj) - Возвращает логическое значение true, если вызывающая строка содержит ту же последовательность символов, что и строковое представление объекта obj. Выполняется порядковое сравнение с учетом регистра, но без учета культурной среды

public bool Equals(string value) - Возвращает логическое значение true, если вызывающая строка содержит ту же последовательность символов, что и строка value. Выполняется порядковое сравнение с учетом регистра, но без учета культурной среды

public bool Equals(string value, StringComparison comparisonType) - Возвращает логическое значение true, если вызывающая

строка содержит ту же последовательность символов, что и строка value. Параметр comparison Туре определяет конкретный способ сравнения строк

public static bool Equals(string a, string b) - Возвращает логическое значение true, если строка а содержит ту же последовательность символов, что и строка b. Выполняется порядковое сравнение с учетом регистра, но без учета культурной среды

public static bool Equals(string a, string b, StringComparison comparisonType) - Возвращает логическое значение true, если строка а содержит ту же последовательность символов, что и строка b. Параметр comparisonType определяет конкретный способ

сравнения строк

Тип StringComparison представляет собой перечисление, в котором определяются значения, приведенные в табл.22.2. Используя эти значения, можно организовать сравнение строк, удовлетворяющее потребностям конкретного приложения. Следовательно, добавление параметра типа StringComparison расширяет возможности метода Compare() и других методов сравнения, например, Equals(). Это дает также возможность однозначно указывать способ предполагаемого сравнения строк. В силу имеющих отличий между сравнением строк с учетом культурной среды и порядковым сравнением очень важно быть предельно точным в этом отношении. Именно по этой причине в примерах программ, приведенных в данной книге, параметр типа StringComparison явно указывается в вызовах тех методов, в которых он поддерживается.

Таблица 22.2. Значения, определяемые в перечислении StringComparison

Значение - Описание

CurrentCulture - Сравнение строк производится с использованием текущих настроек параметров культурной среды

CurrentCultureIgnoreCase - Сравнение строк производится с использованием текущих настроек параметров культурной среды, но без учета регистра

InvariantCulture - Сравнение строк производится с использованием неизменяемых, т.е. универсальных данных о культурной среде

InvariantCulturelngoreCase - Сравнение строк производится с использованием не изменяемых, т.е. универсальных данных о культурной среде и без учета регистра

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

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

В любом случае метод Compare() возвращает отрицательное значение, если первая сравниваемая строка оказывается меньше второй; положительное значение, если первая сравниваемая строка больше второй; и наконец, нуль, если обе сравниваемые строки равны. Несмотря на то что метод Compare() возвращает нуль, если сравниваемые строки равны, для определения равенства символьных строк, как правило, лучше пользоваться методом Equals() или же оператором ==. Дело в том, что метод Compare() определяет равенство сравниваемых строк на основании порядка их сортировки. Так, если выполняется сравнение строк с учетом культурной среды, то обе строки могут оказаться одинаковыми по порядку их сортировки, но не равными по существу. По умолчанию равенство строк определяется в методе Equals(), исходя из порядковых значений символов и без учета культурной среды. Следовательно, по умолчанию обе строки сравниваются в этом методе на абсолютное, посимвольное равенство подобно тому, как это делается в операторе ==.

Несмотря на большую универсальность метода Compare(), для простого порядкового сравнения символьных строк проще пользоваться методом CompareOrdinal(). И наконец, следует иметь в виду, что метод CompareTo() выполняет сравнение строк только с учетом культурной среды. На момент написания этой книги отсутствовали перегружаемые варианты этого метода, позволявшие указывать другой способ сравнения символьных строк.

В приведенной ниже программе демонстрируется применение методов Compare(), Equals(), CompareOrdinal(), а также операторов == и != для сравнения символьных строк. Обратите внимание на то, что два первых примера сравнения наглядно демонстрируют отличия между сравнением строк с учетом культурной среды и порядковым сравнением в англоязычной среде.

// Продемонстрировать разные способы сравнения символьных строк.
using System;
class CompareDemo {
  static void Main() {
    string str1 = "alpha";
    string str2 = "Alpha";
    string str3 = "Beta";
    string str4 = "alpha";
    string str5 = "alpha, beta";
    int result;
    // Сначала продемонстрировать отличия между сравнением строк
    // с учетом культурной среды и порядковым сравнением.
    result = String.Compare(str1, str2, StringComparison.CurrentCulture);
    Console.Write("Сравнение строк с учетом культурной среды: ");
    if (result < 0)
      Console.WriteLine(str1 + " меньше " + str2);
    else if (result > 0)
      Console.WriteLine(str1 + " больше " + str2);
    else
      Console.WriteLine(str1 + " равно " + str2);
    result = String.Compare(str1, str2, StringComparison.Ordinal);
    Console.Write("Порядковое сравнение строк: ");
    if (result < 0)
      Console.WriteLine(str1 + " меньше " + str2);
    else if (result > 0)
      Console.WriteLine(str1 + " больше " + str2);
    else
      Console.WriteLine(str1 + " равно " + str4);
    // Использовать метод CompareOrdinal().
    result = String.CompareOrdinal(str1, str2);
    Console.Write("Сравнение строк методом CompareOrdinal():n");
    if (result < 0)
      Console.WriteLine(str1 + " меньше " + str2);
    else if (result > 0)
      Console.WriteLine(str1 + " больше " + str2);
    else
      Console.WriteLine(str1 + " равно " + str4);
    Console.WriteLine();
    // Определить равенство строк с помощью оператора == .
    // Это порядковое сравнение символьных строк,
    if (str1 == str4)
      Console.WriteLine(str1 + " == " + str4);
    // Определить неравенство строк с помощью оператора !=.
    if (str1 != str3)
      Console.WriteLine(str1 + " != " + str3);
    if (str1 != str2)
      Console.WriteLine(str1 + " != " + str2);
    Console.WriteLine();
    // Выполнить порядковое сравнение строк без учета регистра,
    // используя метод Equals().
    if (String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase))
      Console.WriteLine("Сравнение строк методом Equals() с "
              + "параметром OrdinallgnoreCase:n"
              + str1 + " равно " + str2);
    Console.WriteLine();
    // Сравнить части строк,
    if (String.Compare(str2, 0, str5, 0, 3,
               StringComparison.CurrentCulture) > 0) {
      Console.WriteLine("Сравнение строк с учетом текущей культурной среды:"
             + "3 первых символа строки " + str2 +
             " больше, чем 3 первых символа строки " + str5);
    }
  }
}

Выполнение этой программы приводит к следующему результату.

Сравнение строк с учетом культурной среды: alpha меньше Alpha
Порядковое сравнение строк: alpha больше Alpha
Сравнение строк методом CompareOrdinal(): alpha больше Alpha
alpha == alpha
alpha != Beta
alpha != Alpha
Сравнение строк методом Equals() с параметром OrdinallgnoreCase: alpha равно Alpha
Сравнение строк с учетом текущей культурной среды:
3 первых символа строки Alpha больше, чем 3 первых символа строки alpha, beta

Сцепление строк

Строки можно сцеплять, т.е. объединять вместе, двумя способами. Во-первых, с помощью оператора +, как было показано в главе 7. И во-вторых, с помощью одного из методов сцепления, определенных в классе String. Конечно, для этой цели проще всего воспользоваться оператором +, тем не менее методы сцепления служат неплохой альтернативой такому подходу.

Метод, выполняющий сцепление строк, называется Concat(). Ниже приведена одна из самых распространенных его форм.

public static string Concat(string str0, string str1)

Этот метод возвращает строку, состоящую из строки str1, присоединяемой путем сцепления в конце строки str0. Ниже приведена еще одна форма метода Concat(), в которой сцепляются три строки.

public static string Concat(string str0, string str1,string str2)

В данной форме метод Concat() возвращает строку, состоящую из последовательно сцепленных строк str0, str1 и str2.

Имеется также форма метода Concat(), в которой сцепляются четыре строки.

public static string Concat(string str0, string str1, string str2, string str3)

В этой форме метод Concat() возвращает строку, состоящую из четырех последовательно сцепленных строк.

А в приведенной ниже еще одной форме метода Соncat() сцепляется произвольное количество строк:

public static string Concat(params string[] values)

где values обозначает переменное количество аргументов, сцепляемых для получения возвращаемого результата. Если в этой форме метода Concat() допускается сцепление произвольного количества строк, то зачем нужны все остальные его формы? Они существуют ради повышения эффективности. Ведь передача методу от одного до четырех аргументов оказывается намного эффективнее, чем использование для этой цели переменного списка аргументов.

В приведенном ниже примере программы демонстрируется применение метода Concat() в форме с переменным списком аргументов.

// Продемонстрировать применение метода Concat().
using System;
class ConcatDemo {
  static void Main() {
    string result = String.Concat("Это ", "тест ", "метода ",
          "сцепления ", "строк ",
          "из класса ", "String." );
    Console.WriteLine("Результат: " + result);
  }
}

Эта программа дает следующий результат.

Результат: Это тест метода сцепления строк из класса String.

Кроме того, существуют варианты метода Concat(), в которых он принимает в качестве параметров ссылки на объекты, а не на строки. В этих вариантах метод Concat() получает строковые представления вызывающих объектов, а возвращает объединенную строку, сцепленную из этих представлений. (Строковые представления объектов получаются с помощью метода ToString(), вызываемого для этих объектов.) Ниже приведены все подобные варианты и формы метода Concat().

public static string Concat(object arg0)
public static string Concat(object arg0, object arg1)
public static string Concat(object arg0, object arg1, object arg2)
public static string Concat(object arg0, object arg1, object arg2, object arg3)
public static string Concat(params object[] args)

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

// Продемонстрировать применение объектной формы метода Concat().
using System;
class MyClass {
  public static int Count = 0;
  public MyClass() { Count++; }
}
class ConcatDemo {
  static void Main() {
    string result = String.Concat("значение равно " + 19);
    Console.WriteLine("Результат: " + result);
    result = String.Concat("привет ", 88, " ", 20.0,
           " ", false, " ", 23.45M);
    Console.WriteLine("Результат: " + result);
    MyClass me = new MyClass();
    result = String.Concat(me, " текущий счет равен ",
            MyClass.Count);
    Console.WriteLine("Результат: " + result);
  }
}

Вот к какому результату приводит выполнение этой программы.

Результат: значение равно 19
Результат: привет 88 20 False 23.45
Результат: MyClass текущий счет равен 1

В данном примере метод Concat() сцепляет строковые представления различных типов данных. Для каждого аргумента этого метода вызывается соответствующий метод ToString(), с помощью которого получается строковое представление аргумента. Следовательно, в следующем вызове метода Concat():

string result = String.Concat("значение равно " + 19);

метод Int32.ToString() вызывается для получения строкового представления целого значения 19, а затем метод Concat() сцепляет строки и возвращает результат.

Обратите также внимание на применение объекта определяемого пользователем класса MyClass в следующем вызове метода Concat().

result = String.Concat(me, " текущий счет равен ",
                         MyClass.Count);

В данном случае возвращается строковое представление объекта типа MyClass, сцепленное с указываемой строкой. По умолчанию это просто имя класса. Но если переопределить метод ToString(), то вместо строки с именем класса MyClass может быть возвращена другая строка. В качестве упражнения попробуйте ввести в приведенный выше пример программы следующий фрагмент кода.

public override string ToString()    {
return "Объект типа MyClass";
}

В этом случае последняя строка результата выполнения программы будет выглядеть так, как показано ниже.

Результат: Объект типа MyClass текущий счет равен 1

В версию 4.0 среды .NET Framework добавлены еще две формы метода Concat(), приведенные ниже.

public static string Concat<T>(IEnumerable<T> values)
public static string Concat(IEnumerable<string> values)

В первой форме этого метода возвращается символьная строка, состоящая из сцепленных строковых представлений ряда значений, имеющихся в объекте, который обозначается параметром values и может быть объектом любого типа, реализующего интерфейс IEnumerable<T>. А во второй форме данного метода сцепляются строки, обозначаемые параметром values. (Следует, однако, иметь в виду, что если приходится выполнять большой объем операций сцепления символьных строк, то для этой цели лучше воспользоваться средствами класса StringBuilder.)

Поиск в строке

В классе String предоставляется немало методов для поиска в строке. С их помощью можно, например, искать в строке отдельный символ, строку, первое или последнее вхождение того и другого в строке. Следует, однако, иметь в виду, что поиск может осуществляться либо с учетом культурной среды либо порядковым способом.

Для обнаружения первого вхождения символа или подстроки в исходной строке служит метод IndexOf(). Для него определено несколько перегружаемых форм. Ниже приведена одна из форм для поиска первого вхождения символа в исходной строке.

public int IndexOf(char value)

В этой форме метода IndexOf() возвращается первое вхождение символа value в вызывающей строке. Если символ value в ней не найден, то возвращается значение -1. При таком поиске символа настройки культурной среды игнорируются. Следовательно, в данном случае осуществляется порядковый поиск первого вхождения символа. .

Ниже приведены еще две формы метода IndexOf(), позволяющие искать первое вхождение одной строки в другой.

public int IndexOf(String value)
public int IndexOf(String value, StringComparison comparisonType)

В первой форме рассматриваемого здесь метода поиск первого вхождения строки, обозначаемой параметром value, осуществляется с учетом культурной среды. А во второй форме предоставляется возможность указать значение типа StringComparison, обозначающее способ поиска. В если искомая строка не найдена, то в обеих формах данного метода возвращается значение -1.

Для обнаружения последнего вхождения символа или строки в исходной строке служит метод LastIndexOf(). И для этого метода определено несколько перегружаемых форм. Ниже приведена одна из форм для поиска последнего вхождения символа в вызывающей строке.

public int LastlndexOf(char value)

В этой форме метода LastlndexOf() осуществляется порядковый поиск, а в итоге возвращается последнее вхождение символа value в вызывающей строке или же значение -1, если искомый символ не найден.

Ниже приведены еще две формы метода LastlndexOf(), позволяющие искать последнее вхождение одной строки в другой.

public int LastlndexOf(string value)
public int LastlndexOf(string value, StringComparison comparisonType)

В первой форме рассматриваемого здесь метода поиск последнего вхождения строки, обозначаемой параметром value, осуществляется с учетом культурной среды. А во второй форме предоставляется возможность указать значение типа StringComparison, обозначающее способ поиска. Если же искомая строка не найдена, то в обеих формах данного метода возвращается значение -1.

В классе String предоставляются еще два интересных метода поиска в строке: IndexOfAny() и LastlndexOfAny(). Оба метода обнаруживают первый символ, совпадающий с любым набором символов. Ниже приведены простейшие формы этих методов.

public int IndexOfAny(char[] anyOf) public int LastlndexOfAny(char[] anyOf)

Метод IndexOfAny() возвращает индекс первого вхождения любого символа из массива anyOf, обнаруженного в вызывающей строке, а метод LastlndexOfAny() — индекс последнего вхождения любого символа из массива anyOf, обнаруженного в вызывающей строке. Если совпадение символов не обнаружено, то в обоих случаях возвращается значение -1. Кроме того, в обоих рассматриваемых здесь методах осуществляется порядковый поиск.

При обработке символьных строк нередко оказывается полезно знать, начинается ли строка заданной подстрокой или же оканчивается ею. Для этой цели служат методы StartsWith() и EndsWith(). Ниже приведены их простейшие формы.

public bool StartsWith(string value)
public bool EndsWith(string value)

Метод StartsWith() возвращает логическое значение true, если вызывающая строка начинается с подстроки, переданной ему в качестве аргумента value. А метод EndsWith() возвращает логическое значение true, если вызывающая строка оканчивается подстрокой, переданной ему в качестве аргумента value. В противном случае оба метода возвращают логическое значение false.

В обоих рассматриваемых здесь методах поиск осуществляется с учетом культурной среды. Для того чтобы указать конкретный способ поиска подстроки, можно воспользоваться приведенными ниже вариантами этих методов с дополнительным параметром типа StringComparison.

public bool StartsWith(string value, StringComparison comparisonType)
public bool EndsWith(string value, StringComparison comparisonType)

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

В приведенном ниже примере программы демонстрируется применение нескольких методов поиска в строке.

// Продемонстрировать поиск в строке.
using System;
class StringSearchDemo {
  static void Main() {
    string str = "C# обладает эффективными средствами обработки строк.";
    int idx;
    Console.WriteLine("Строка str: " + str);
    idx = str.IndexOf('о');
    Console.WriteLine("Индекс первого вхождения символа 'o': " + idx);
    idx = str.LastIndexOf('о');
    Console.WriteLine("Индекс последнего вхождения символа 'o': " + idx);
    idx = str.IndexOf("ми", StringComparison.Ordinal);
    Console.WriteLine("Индекс первого вхождения подстроки "ми": " + idx);
    idx = str.LastIndexOf("ми", StringComparison.Ordinal);
    Console.WriteLine("Индекс последнего вхождения подстроки "ми": " + idx);
    char[] chrs = { 'a', '6', 'в' };
    idx = str.IndexOfAny(chrs);
    Console.WriteLine("Индекс первого вхождения символов " +
            "'а','б' или 'в': " + idx);
    if (str.StartsWith("C# обладает", StringComparison.Ordinal))
      Console.WriteLine("Строка str начинается с подстроки "C# обладает"");
    if (str.EndsWith("строк.", StringComparison.Ordinal))
      Console.WriteLine("Строка str оканчивается подстрокой "строк."");
  }
}

Ниже приведен результат выполнения этой программы.

Строка str: C# обладает эффективными средствами обработки строк.
Индекс первого вхождения символа 'о' : 3
Индекс последнего вхождения символа 'о': 49
Индекс первого вхождения подстроки "ми": 22
Индекс последнего вхождения подстроки "ми": 33
Индекс первого вхождения символов 'а', 'б' или 'в': 4
Строка str начинается с подстроки "C# обладает"
Строка str оканчивается подстрокой "строк."

Во многих случаях полезным для поиска в строке оказывается метод Contains(). Его общая форма выглядит следующим образом.

public bool Contains(string value)

Метод Contains() возвращает логическое значение true, если вызывающая строка содержит подстроку, обозначаемую параметром value, в противном случае — логическое значение false. Поиск указываемой подстроки осуществляется порядковым способом. Этот метод особенно полезен, если требуется только выяснить, находится ли конкретная подстрока в другой строке. В приведенном ниже примере программы демонстрируется применение метода Contains().

// Продемонстрировать применение метода Contains().
using System;
class ContainsDemo {
  static void Main() {
    string str = "C# сочетает эффективность с производительностью.";
    if(str.Contains("эффективность"))
      Console.WriteLine("Обнаружена подстрока "эффективность".");
    if(str.Contains("эффе"))
      Console.WriteLine("Обнаружена подстрока "эффе".");
    if(!str.Contains("эффективный"))
      Console.WriteLine("Подстрока "эффективный" не обнаружена.");
  }
}

Выполнение этой программы приводит к следующему результату.

Обнаружена подстрока "эффективность".
Обнаружена подстрока "эффе".
Подстрока "эффективный" не обнаружена.

Как следует из результата выполнения приведенной выше программы, метод Contains() осуществляет поиск на совпадение произвольной последовательности символов, а не только целых слов. Поэтому в вызывающей строке обнаруживается и подстрока "эффективность", и подстрока "эффе". Но поскольку в вызывающей строке отсутствует подстрока "эффективный", то она и не обнаруживается.

У некоторых методов поиска в строке имеются дополнительные формы, позволяющие начинать поиск по указанному индексу или указывать пределы для поиска в строке. В табл.22.3 сведены все варианты методов поиска в строке, которые поддерживаются в классе String.

Таблица 22.3. Методы поиска в строке, поддерживаемые в классе String

Метод - Назначение

public bool Contains(string value) - Возвращает логическое значение true, если вызывающая строка содержит подстроку value. Если же подстрока value не обнаружена, возвращается логическое значение false

public bool EndsWith(string value) - Возвращает логическое значение* true, если вызывающая строка оканчивается подстрокой value. В противном случае возвращает логическое значение false

public bool EndsWith(string value,StringComparison comparisonType) -  Возвращает логическое значение true, если вызывающая строка оканчивается подстрокой value. В противном случае возвращает логическое значение false. Параметр comparisonType определяет конкретный способ поиска

public bool EndsWith(string value,bool ignoreCase,Culturelnfo culture) - Возвращает логическое значение true, если вызывающая строка оканчивается подстрокой value, иначе возвращает логическое значение false. Если параметр ignoreCase принимает логическое значение true, то при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Поиск осуществляется с использованием информации о культурной среде, обозначаемой параметром culture

public int IndexOf(char value) - Возвращает индекс первого вхождения символа value в вызывающей строке. Если искомый символ не обнаружен, то возвращается значение -1

public int IndexOf(string value) -  Возвращает индекс первого вхождения подстроки value в вызывающей строке. Если искомая подстрока не обнаружена, то возвращается значение -1

public int IndexOf(char value,int startlndex) - Возвращает индекс первого вхождения символа value в вызывающей строке. Поиск начинается с элемента, указываемого по индексу startlndex. Метод возвращает значение -1, если искомый символ не обнаружен

public int IndexOf(string value, int startlndex) - Возвращает индекс первого вхождения подстроки value в вызывающей строке. Поиск начинается с элемента, указываемого по индексу startlndex. Метод возвращает значение -1, если искомая подстрока не обнаружена

public int IndexOf(char value,int startlndex, int count) - Возвращает индекс первого вхождения символа value в вызывающей строке. Поиск начинается с элемента, указываемого по индексу startlndex, и охватывает число элементов, определяемых параметром count. Метод возвращает значение -1, если искомый символ не обнаружен

public int IndexOf(string value, int startlndex,int count) - Возвращает индекс первого вхождения подстроки value в вызывающей строке. Поиск начинается с элемента, указываемого по индексу startlndex, и охватывает число элементов, определяемых параметром count. Метод возвращает значение -1, если искомая подстрока не обнаружена public int

IndexOf(string value, StringComparison comparisonType) - Возвращает индекс первого вхождения подстроки value в вызывающей строке. Параметр comparisonType определяет конкретный способ выполнения поиска. Метод возвращает значение -1, если искомая подстрока не обнаружена

public int IndexOf(string value, int startlndex, StringComparison comparison Type) - Возвращает индекс первого вхождения подстроки value в вызывающей строке. Поиск начинается с элемента, указываемого по индексу startlndex. Параметр comparisonType определяет конкретный способ выполнения поиска. Метод возвращает значение -1, если искомая подстрока не обнаружена

public int IndexOf(string value, int startlndex,int count, StringComparison comparisonType) - Возвращает индекс первого вхождения подстроки value в вызывающей строке. Поиск начинается с элемента, указываемого по индексу startlndex, и охватывает число элементов, определяемых параметром count. Параметр comparisonType определяет конкретный способ выполнения поиска. Метод возвращает значение -1, если искомая подстрока не обнаружена

public int LastlndexOf(char value) - Возвращает индекс последнего вхождения символа value в вызывающей строке. Если искомый символ не обнаружен, возвращается значение -1

public int IndexOfAny(char[] anyOf) - Возвращает индекс первого вхождения любого символа из массива anyOf, обнаруженного в вызывающей строке. Метод возвращает значение -1, если не обнаружено совпадение ни с одним из символов из массива anyOf. Поиск осуществляется порядковым способом

public int IndexOfAny(char[] anyOf, int startlndex) - Возвращает индекс первого вхождения любого символа из массива anyOf, обнаруженного в вызывающей строке. Поиск начинается с элемента, указываемого по индексу startlndex Метод возвращает значение -1, если не обнаружено совпадение ни с одним из символов из массива anyOf. Поиск осуществляется порядковым способом

public int IndexOfAny(char[] anyOf, int startlndex,int count) - Возвращает индекс первого вхождения любого символа из массива anyOf, обнаруженного в вызывающей строке. Поиск начинается с элемента, указываемого по^ индексу startlndex, и охватывает число элементов, определяемых параметром count. Метод возвращает значение -1, если не обнаружено совпадение ни с одним из символов из массива anyOf. Поиск осуществляется порядковым способом

public int LastlndexOf(string value) - Возвращает индекс последнего вхождения подстроки value в вызывающей строке. Если искомая подстрока не обнаружена, возвращается значение -1

public int LastlndexOf(char value, int startlndex) - Возвращает индекс последнего вхождения символа value в части вызывающей строки. Поиск осуществляется в обратном порядке, начиная с элемента, указываемого по индексу startlndex, и заканчивая элементом с нулевым индексом. Метод возвращает значение -1, если искомый символ не обнаружен

public int LastlndexOf(string value, int startlndex) - Возвращает индекс последнего вхождения подстроки value в части вызывающей строки. Поиск осуществляется в обратном порядке, начиная с элемента, указываемого по индексу startlndex, и заканчивая элементом с нулевым индексом. Метод возвращает значение -1, если искомая подстрока не обнаружена

public int LastlndexOf(char value, int startlndex,int count) - Возвращает индекс последнего вхождения символа value в части вызывающей строки. Поиск осуществляется в обратном порядке, начиная с элемента, указываемого по индексу startlndex, и охватывает число элементов, определяемых параметром count. Метод возвращает значение -1, если искомый символ не обнаружен

public int LastlndexOf(string value, int startlndex,int count) - Возвращает индекс последнего вхождения подстроки value в части вызывающей строки. Поиск осуществляется в обратном порядке, начиная с элемента, указываемого по индексу startlndex, и охватывает число элементов, определяемых параметром count. Метод возвращает значение -1, если искомая подстрока не обнаружена

public int LastlndexOf(string value, StringComparison comparisonType) - Возвращает индекс последнего вхождения

подстроки value в вызывающей строке. Параметр comparisonType определяет конкретный способ выполнения поиска. Метод возвращает значение -1, если искомая подстрока не обнаружена

public int LastlndexOf(string value, int startlndex,StringComparison comparisonType) - Возвращает индекс последнего вхождения подстроки value в части вызывающей строки. Поиск осуществляется в обратном порядке, начиная с элемента, указываемого по индексу startlndex, и заканчивая элементом с нулевым индексом. Параметр comparisonType определяет конкретный способ выполнения поиска. Метод возвращает значение -1, если искомая подстрока не обнаружена

public int LastlndexOf(string value, int startlndex,int count, StringComparison comparisonType) - Возвращает индекс последнего вхождения подстроки value в части вызывающей строки. Поиск осуществляется в обратном порядке, начиная с элемента, указываемого по индексу startlndex, и охватывает число элементов, определяемых параметром count. Параметр comparisonType определяет конкретный способ выполнения поиска. Метод возвращает значение -1, если искомая подстрока не обнаружена

public int LastlndexOfAny(char[] anyOf) - Возвращает индекс последнего вхождения любого символа из массива anyOf, обнаруженного в вызывающей строке. Метод возвращает значение -1, если не обнаружено совпадение ни с одним из символов из массива anyOf. Поиск осуществляется порядковым способом

public int LastlndexOfAny(char[] anyOf,int startlndex) - Возвращает индекс последнего вхождения любого символа из массива anyOf, обнаруженного в вызывающей строке. Поиск начинается в обратном порядке с элемента, указываемого по индексу startlndex, и заканчивая элементом с нулевым индексом. Метод возвращает значение -1, если не обнаружено совпадение ни с одним из символов из массива anyOf. Поиск осуществляется порядковым способом

public int LastlndexOfAny(char[] anyOf,int startlndex,int count) - Возвращает индекс последнего вхождения любого символа из массива anyOf, обнаруженного в вызывающей строке. Поиск осуществляется в обратном порядке, начиная с элемента, указываемого по индексу startlndex, и охватывает число элементов, определяемых параметром count, число элементов, определяемых параметром count. Метод возвращает значение -1, если не обнаружено совпадение ни с одним из символов из массива anyOf. Поиск осуществляется порядковым способом

public bool StartsWith(string value) - Возвращает логическое значение true, если вызывающая строка начинается с подстроки value. В противном случае возвращается логическое значение false

public bool StartsWith(string value,StringComparison comparisonType) -  Возвращает логическое значение true, если вызывающая строка начинается с подстроки value. В противном случае возвращается логическое значение false. Параметр comparisonType определяет конкретный способ выполнения поиска

public bool StartsWith(string value,bool ignoreCase,Culturelnfo culture) -  Возвращает логическое значение true, если вызывающая строка начинается с подстроки value. В противном случае возвращается логическое значение false. Если параметр ignoreCase принимает логическое значение true, то при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Поиск осуществляется с использованием информации о культурной среде, обозначаемой параметром culture

Разделение и соединение строк

К основным операциям обработки строк относятся разделение и соединение. При разделении строка разбивается на составные части, а при соединении строка составляется из отдельных частей. Для разделения строк в классе String определен метод Split(), а для соединения — метод Join().

Существует несколько вариантов метода 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 startlndex, int count)

В первой форме метода Join() возвращается строка, состоящая из сцепляемых подстрок, передаваемых в массиве value. Во второй форме также возвращается строка, состоящая из подстрок, передаваемых в массиве value, но они сцепляются в определенном количестве count, начиная с элемента массива value [startlndex]. В обеих формах каждая последующая строка отделяется от предыдущей разделительной строкой, определяемой параметром 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 + "|");
  }
}

Эта программа дает следующий результат.

Исходная строка: тест
|    тест|
|    тест    |
|тест|
|######тест|
|######тест##########|
|тест|

Вставка, удаление и замена строк

Для вставки одной строки в другую служит приведенный ниже метод Insert():

public string Insert(int startlndex, string value)

где value обозначает строку, вставляемую в вызывающую строку по индексу startlndex. Метод возвращает получившуюся в итоге строку.

Для удаления части строки служит метод Remove(). Ниже приведены две его формы.

public string Remove(int startlndex)
public string Remove(int startlndex, int count)

В первой форме метода Remove() удаление выполняется, начиная с места, указываемого по индексу startlndex, и продолжается до конца строки. А во второй форме данного метода из строки удаляется количество символов, определяемое параметром count, начиная с места, указываемого по индексу startlndex. В обеих формах возвращается получающаяся в итоге строка.

Для замены части строки служит метод Replace(). Ниже приведены две его формы.

public string Replace(char oldChar, char newChar)
public string Replace(string oldValue, string newValue)

В первой форме метода Replace() все вхождения символа oldChar в вызывающей строке заменяются символом newChar. А во второй форме данного метода все вхождения строки oldValue в вызывающей строке заменяются строкой newValue. В обеих формах возвращается получающаяся в итоге строка.

В приведенном ниже примере демонстрируется применение методов Insert(), Remove() и Replace().

// Пример вставки, замены и удаления строк.
using System;
class InsRepRevDemO {
  static void Main() {
    string str = "Это тест";
     Console.WriteLine("Исходная строка: " + str);
    // Вставить строку.
    str = str.Insert(4, "простой ");
    Console.WriteLine(str) ;
    // Заменить строку.
    str = str.Replace("простой", "непростой ");
    Console.WriteLine (str);
    // Заменить символы в строке
    str = str.Replace('т', 'X');
    Console.WriteLine(str);
    // Удалить строку, str = str.Remove(4, 5);
    Console.WriteLine(str);
  }
}

Ниже приведен результат выполнения этой программы.

Исходная строка: Это тест
Это простой тест
Это непростой тест
ЭХо непросХой ХесХ
ЭХо сХой ХесХ

Смена регистра

В классе String предоставляются два удобных метода, позволяющих сменить регистр букв в строке, — ToUpper() и ToLower(). Диже приведены их простейшие формы.

public string ToLower()
public string ToUpper()

Метод ToLower() делает строчными все буквы в вызывающей строке, а метод ToUpper() делает их прописными. В обоих случаях возвращается получающаяся в итоге строка. Имеются также следующие формы этих методов, в которых можно указывать информацию о культурной среде и способы преобразования символов.

public string ToLower (Culturelnfo culture)
public string ToUpper(Culturelnfo culture)

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

Кроме того, имеются следующие методы ToUpperInvariant() и ToLowerlnvariant().

public string ToUpperlnvariant()
public string ToLowerlnvariant()

Эти методы аналогичны методам ToUpper() и ToLower(), за исключением того, что они изменяют регистр букв в вызывающей строке безотносительно к настройкам культурной среды.

Применение метода Substring()

Для получения части строки служит метод Substring(). Ниже приведены две его формы.

public string Substring(int startlndex)
public string Substring(int startlndex, int length)

В первой форме метода Substring() подстрока извлекается, начиная с места, обозначаемого параметром startlndex, и до конца вызывающей строки. А во второй форме данного метода извлекается подстрока, состоящая из количества символов, определяемых параметром length, начиная с места, обозначаемого параметром startlndex. В обеих формах возвращается получающаяся в итоге подстрока.

В приведенном ниже примере программы демонстрируется применение метода Substring().

// Использовать метод Substring().
using System;
class SubstringDemo {
  static void Main() {
    string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    Console.WriteLine("Строка str: " + str);
    Console.Write("Подстрока str.Substring(15): ");
    string substr = str.Substring(15);
    Console.WriteLine(substr);
    Console.Write("Подстрока str.Substring(0, 15): ");
    substr = str.Substring(0, 15);
    Console.WriteLine (substr);
  }
}

Эта программа дает следующий результат.

Строка str: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Подстрока str.Substring(15): PQRSTUVWXYZ
Подстрока' str. Substring (0, 15): ABCDEFGHIJKLMNO

Методы расширения класса String

Как упоминалось ранее, в классе String реализуется обобщенный интерфейс IEnumerable<T>. Это означает, что, начиная с версии C# 3.0, для объекта класса String можно вызывать методы расширения, определенные в классах Enumerable и Queryable, которые находятся в пространстве имен System.Linq. Эти методы расширения служат главным образом для поддержки LINQ, хотя некоторые из них могут использоваться в иных целях, в том числе и в определенных видах обработки строк. Подробнее о методах расширения см. в главе 19.

Оглавление книги


Генерация: 0.103. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз