Упражнение. Использование вспомогательных методов IndexOf() и Substring() строки

Завершено

В этом упражнении метод используется IndexOf() для поиска позиции одной или нескольких символов внутри большей строки. Метод используется Substring() для возврата части большей строки, которая соответствует заданным позициям символов.

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

Подготовка среды программирования

Этот модуль включает практические действия, которые помогут вам в процессе создания и выполнения демонстрационного кода. Рекомендуется выполнить эти действия с помощью Visual Studio Code в качестве среды разработки. Использование Visual Studio Code для этих действий помогает вам стать удобным написанием и выполнением кода в среде разработчика, используемой специалистами по всему миру.

Примечание.

Если вы выполнили другие модули Microsoft Learn в этой серии C#, возможно, вы уже создали папку проекта для примеров кода. Если это так, можно пропустить следующий раздел шагов и удалить код в Project.cs файле, используемом для предыдущего упражнения.

  1. Откройте Visual Studio Code.

    Для открытия Visual Studio Code можно использовать меню Windows (или эквивалентный ресурс для другой ОС).

  2. В меню "Файл Visual Studio Code" выберите "Открыть папку".

  3. В диалоговом окне "Открыть папку" перейдите в папку "Рабочий стол Windows".

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

  4. В диалоговом окне "Открыть папку" выберите "Выбрать папку".

    Если появится диалоговое окно безопасности с запросом доверия авторам, нажмите кнопку "Да".

  5. В меню терминала Visual Studio Code выберите новый терминал.

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

    C:\Users\someuser\Desktop>
    
  6. В командной строке терминала создайте консольное приложение в указанной папке, введите dotnet new console -o ./CsharpProjects/TestProject и нажмите клавишу ВВОД.

    Эта команда .NET CLI использует шаблон программы .NET для создания проекта консольного приложения C# в указанном расположении папки. Команда создает папки CsharpProjects и TestProject для вас и использует TestProject в качестве имени .csproj файла.

  7. На панели обозревателя разверните папку CsharpProjects .

    Вы увидите папку TestProject и два файла, файл программы C# с именем Program.cs и файл проекта C# с именем TestProject.csproj.

  8. На панели обозревателя выберите Program.cs, чтобы просмотреть файл кода на панели редактора.

  9. Удалите существующие строки кода.

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

  10. Закройте панель терминала.

Написание кода для поиска пар круглых скобок, внедренных в строку

  1. Убедитесь, что на панели редактора открыт и Program.cs visual Studio Code.

    Примечание.

    Program.cs должно быть пустым. Если нет, выберите и удалите все строки кода.

  2. Введите следующий код в редактор Visual Studio Code:

    string message = "Find what is (inside the parentheses)";
    
    int openingPosition = message.IndexOf('(');
    int closingPosition = message.IndexOf(')');
    
    Console.WriteLine(openingPosition);
    Console.WriteLine(closingPosition);
    
  3. В меню "Файл Visual Studio Code" нажмите кнопку "Сохранить".

    Перед созданием или выполнением кода необходимо сохранить файл Program.cs.

  4. На панели обозревателя откройте терминал в папке TestProject, щелкните правой кнопкой мыши TestProject и выберите "Открыть в интегрированном терминале".

    Панель терминала должна открыться и должна содержать командную строку, показывающую, что терминал открыт для расположения папки TestProject.

  5. В командной строке терминала, чтобы запустить код, введите dotnet run и нажмите клавишу ВВОД.

    Примечание.

    Если появится сообщение "Не удалось найти проект для запуска", убедитесь, что в командной строке терминала отображается ожидаемое расположение папки TestProject. Например: C:\Users\someuser\Desktop\csharpprojects\TestProject>

    Должен появиться следующий результат:

    13
    36
    

    В данном случае индекс символа ( равен 13. Помните, что эти значения отсчитываются от нуля, поэтому это 14-й символ в строке. Индекс символа ) равен 36.

    Теперь, когда у вас есть два индекса, их можно использовать в качестве границ для извлечения значения между ними.

Добавление кода для получения значения между скобками

  1. Обновите код в редакторе Visual Studio Code следующим образом:

    string message = "Find what is (inside the parentheses)";
    
    int openingPosition = message.IndexOf('(');
    int closingPosition = message.IndexOf(')');
    
    // Console.WriteLine(openingPosition);
    // Console.WriteLine(closingPosition);
    
    int length = closingPosition - openingPosition;
    Console.WriteLine(message.Substring(openingPosition, length));
    
  2. Сохраните файл кода и используйте Visual Studio Code для запуска кода. Должен появиться следующий результат:

    (inside the parentheses
    

    Методу Substring() требуется начальная позиция и число символов (или длина) для извлечения. Таким образом, вы вычисляете длину во временной переменной, вызываемой length, и передайте ее со openingPosition значением, чтобы получить строку внутри скобки.

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

Изменение начальной позиции подстроки

  1. Обновите код в редакторе Visual Studio Code следующим образом:

    string message = "Find what is (inside the parentheses)";
    
    int openingPosition = message.IndexOf('(');
    int closingPosition = message.IndexOf(')');
    
    openingPosition += 1;
    
    int length = closingPosition - openingPosition;
    Console.WriteLine(message.Substring(openingPosition, length));
    
  2. Сохраните файл кода и используйте Visual Studio Code для запуска кода. Должен появиться следующий результат:

    inside the parentheses
    
  3. Просмотрите предыдущий код и строку openingPosition += 1;.

    Увеличив openingPosition на 1, вы пропускаете открывающую круглую скобку.

    Причина, по которой вы используете значение 1 , заключается в том, что это длина символа. Если вы пытаетесь найти значение, начинающееся после более длинной строки, например, <div> или ---вы будете использовать длину этой строки.

  4. Обновите код в редакторе Visual Studio Code следующим образом:

    string message = "What is the value <span>between the tags</span>?";
    
    int openingPosition = message.IndexOf("<span>");
    int closingPosition = message.IndexOf("</span>");
    
    openingPosition += 6;
    int length = closingPosition - openingPosition;
    Console.WriteLine(message.Substring(openingPosition, length));
    
  5. Просмотрите предыдущий код и строку openingPosition += 6;.

    В предыдущем фрагменте кода показано, как найти значение внутри открывающего и закрывающего <span> тега.

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

Избегание магических значений

Жестко заданные строки, такие как "<span>" в предыдущем листинге кода, называются "магическими строками", а жестко заданные числовые значения, такие как 6, называются "магическими числами". Эти значения "Магия" нежелательны по многим причинам, и вы должны попытаться избежать их, если это возможно.

  1. Просмотрите предыдущий код, чтобы рассмотреть, как код может нарушиться, если вы жестко закодировали строку "<span>" несколько раз в коде, но пропустили один экземпляр как "<sapn>".

    Компилятор не перехватывает "<sapn>" во время компиляции, так как значение находится в строке. Ошибка приводит к проблемам во время выполнения, и в зависимости от сложности кода может быть трудно отслеживать.

    Кроме того, если вы измените строку "<span>" на короче "<div>", но забудьте изменить число 65на, то код выдает нежелательные результаты.

  2. Обновите код в редакторе Visual Studio Code следующим образом:

    string message = "What is the value <span>between the tags</span>?";
    
    const string openSpan = "<span>";
    const string closeSpan = "</span>";
    
    int openingPosition = message.IndexOf(openSpan);
    int closingPosition = message.IndexOf(closeSpan);
    
    openingPosition += openSpan.Length;
    int length = closingPosition - openingPosition;
    Console.WriteLine(message.Substring(openingPosition, length));
    
  3. Минуту, чтобы проверить обновленный код и использовать ключевое словоconst, как используется.const string openSpan = "<span>";

    Код использует константу с const ключевое слово. Константа позволяет определить и инициализировать переменную, значение которой никогда не изменяется. Затем эту константу следует по мере необходимости использовать в остальном коде. Это гарантирует, что значение определяется только один раз, а const переменная перехватана компилятором.

    Предыдущий список кода — это более безопасный способ написания того же кода, который вы изучили в предыдущем разделе. Теперь, если значение openSpan изменений в <div>, строка кода, использующая свойство, продолжает быть допустимой Length .

Кратко

Эта единица охватывала много материала. Ниже приведены наиболее важные моменты, которые следует запомнить:

  • IndexOf() предоставляет первую позицию символа или строки внутри другой строки.
  • IndexOf() возвращает -1, если не удается найти совпадение.
  • Substring() возвращает только указанную часть строки с использованием начальной позиции и необязательной длины.
  • Часто проблему можно решить сразу несколькими способами. Вы использовали два отдельных метода для поиска всех экземпляров заданного символа или строки.
  • Избегайте жестко закодированных магических значений. Вместо этого определите переменную const. Значение константной переменной невозможно изменить после инициализации.

Проверьте свои знания

1.

Что такое возвращаемое значение, где myString.IndexOf('C');string myString = "C# Time";?