Результат: ученик рассматривает string как неизменяемую последовательность кодовых единиц UTF-16, задаёт точный контракт сравнения и разбора и выбирает подходящий способ поиска, преобразования и построения текста.

Содержание:

  1. Различить состояния строкового значения

    • string? и null;
    • пустая строка;
    • строка только из пробельных символов;
    • строка с содержимым;
    • IsNullOrEmpty и IsNullOrWhiteSpace;
    • отсутствующее поле и пустое поле как разные состояния.
  2. Освоить строковые литералы

    • обычный литерал;
    • управляющие последовательности;
    • дословный литерал;
    • интерполированная строка;
    • кавычки и обратная косая черта;
    • переносы строк и устойчивое машинное представление.
  3. Понять UTF-16 и индексацию

    • Length как число значений char;
    • индекс как одна кодовая единица;
    • числовой код char;
    • суррогатная пара;
    • различие кодовой единицы, Unicode-кодовой точки и отображаемой графемы;
    • честное ограничение алгоритма, работающего по char.
  4. Сравнивать строки по явному контракту

    • операторы равенства содержимого для string;
    • StringComparison.Ordinal;
    • порядковое сравнение без учёта регистра;
    • культурно-зависимое сравнение;
    • сортировка строк по выбранному отношению;
    • невозможность смешивать разные правила в одном алгоритме.
  5. Искать символы и фрагменты

    • IndexOf и LastIndexOf;
    • StartsWith и EndsWith;
    • поиск с явным StringComparison;
    • число вхождений;
    • перекрывающиеся и неперекрывающиеся совпадения;
    • контракт пустого образца.
  6. Выделять и изменять фрагменты

    • Substring;
    • Trim, TrimStart, TrimEnd;
    • Remove, Insert, Replace;
    • проверка границ начала и длины;
    • создание нового строкового объекта;
    • сохранение исходной строки.
  7. Разбивать и соединять текст

    • Split;
    • сохранение и удаление пустых частей;
    • соседние и краевые разделители;
    • Join;
    • однозначность обратного соединения;
    • недостаточность простого Split для формата с кавычками и экранированием.
  8. Классифицировать кодовые единицы

    • char.IsLetter, IsDigit, IsWhiteSpace и связанные методы;
    • изменение регистра;
    • ограничения культурно-зависимого регистра;
    • подсчёт категорий;
    • частоты ASCII-символов через массив.
  9. Понимать неизменяемость

    • каждое смысловое изменение создаёт новое строковое значение;
    • присваивание другой переменной той же ссылки на неизменяемый объект;
    • безопасность совместного использования содержимого;
    • стоимость цепочки промежуточных строк;
    • различие идентичности и равенства содержимого.
  10. Выбирать способ построения результата

    • конкатенация небольшого фиксированного числа частей;
    • char[] при заранее известной длине;
    • StringBuilder для последовательного изменения длины;
    • начальная ёмкость;
    • добавление, удаление, вставка и замена;
    • сравнение числа копирований.
  11. Проектировать ручной парсер

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

    • разделители;
    • кавычки и экранирование;
    • пустые и отсутствующие поля;
    • машинное форматирование чисел;
    • round-trip значение → текст → значение;
    • отказ при неоднозначном или повреждённом входе.
  13. Реализовывать текстовые алгоритмы

    • все окна фиксированной длины;
    • скользящее состояние;
    • наивный поиск подстроки;
    • префикс-функция и алгоритм Кнута—Морриса—Пратта;
    • наибольший общий префикс;
    • баланс скобок;
    • кодирование серий.
  14. Оценивать сложные строковые задачи

    • самая длинная подстрока без повторов;
    • расстояние Левенштейна динамическим программированием;
    • O(n), O(n + m), O(nm) и квадратичное построение;
    • дополнительная память;
    • сравнение библиотечной и ручной реализации по одному контракту.