Результат: ученик рассматривает string как неизменяемую последовательность кодовых единиц UTF-16, задаёт точный контракт сравнения и разбора и выбирает подходящий способ поиска, преобразования и построения текста.
Содержание:
-
Различить состояния строкового значения
string?иnull;- пустая строка;
- строка только из пробельных символов;
- строка с содержимым;
IsNullOrEmptyиIsNullOrWhiteSpace;- отсутствующее поле и пустое поле как разные состояния.
-
Освоить строковые литералы
- обычный литерал;
- управляющие последовательности;
- дословный литерал;
- интерполированная строка;
- кавычки и обратная косая черта;
- переносы строк и устойчивое машинное представление.
-
Понять UTF-16 и индексацию
Lengthкак число значенийchar;- индекс как одна кодовая единица;
- числовой код
char; - суррогатная пара;
- различие кодовой единицы, Unicode-кодовой точки и отображаемой графемы;
- честное ограничение алгоритма, работающего по
char.
-
Сравнивать строки по явному контракту
- операторы равенства содержимого для
string; StringComparison.Ordinal;- порядковое сравнение без учёта регистра;
- культурно-зависимое сравнение;
- сортировка строк по выбранному отношению;
- невозможность смешивать разные правила в одном алгоритме.
- операторы равенства содержимого для
-
Искать символы и фрагменты
IndexOfиLastIndexOf;StartsWithиEndsWith;- поиск с явным
StringComparison; - число вхождений;
- перекрывающиеся и неперекрывающиеся совпадения;
- контракт пустого образца.
-
Выделять и изменять фрагменты
Substring;Trim,TrimStart,TrimEnd;Remove,Insert,Replace;- проверка границ начала и длины;
- создание нового строкового объекта;
- сохранение исходной строки.
-
Разбивать и соединять текст
Split;- сохранение и удаление пустых частей;
- соседние и краевые разделители;
Join;- однозначность обратного соединения;
- недостаточность простого
Splitдля формата с кавычками и экранированием.
-
Классифицировать кодовые единицы
char.IsLetter,IsDigit,IsWhiteSpaceи связанные методы;- изменение регистра;
- ограничения культурно-зависимого регистра;
- подсчёт категорий;
- частоты ASCII-символов через массив.
-
Понимать неизменяемость
- каждое смысловое изменение создаёт новое строковое значение;
- присваивание другой переменной той же ссылки на неизменяемый объект;
- безопасность совместного использования содержимого;
- стоимость цепочки промежуточных строк;
- различие идентичности и равенства содержимого.
-
Выбирать способ построения результата
- конкатенация небольшого фиксированного числа частей;
char[]при заранее известной длине;StringBuilderдля последовательного изменения длины;- начальная ёмкость;
- добавление, удаление, вставка и замена;
- сравнение числа копирований.
-
Проектировать ручной парсер
- допустимый алфавит;
- знак и обязательные цифры;
- позиция первого отказа;
- проверка диапазона до переполнения;
- пустые поля;
- культура числового значения;
- согласованное состояние выходов при неуспехе.
-
Проектировать однозначный формат
- разделители;
- кавычки и экранирование;
- пустые и отсутствующие поля;
- машинное форматирование чисел;
- round-trip
значение → текст → значение; - отказ при неоднозначном или повреждённом входе.
-
Реализовывать текстовые алгоритмы
- все окна фиксированной длины;
- скользящее состояние;
- наивный поиск подстроки;
- префикс-функция и алгоритм Кнута—Морриса—Пратта;
- наибольший общий префикс;
- баланс скобок;
- кодирование серий.
-
Оценивать сложные строковые задачи
- самая длинная подстрока без повторов;
- расстояние Левенштейна динамическим программированием;
O(n),O(n + m),O(nm)и квадратичное построение;- дополнительная память;
- сравнение библиотечной и ручной реализации по одному контракту.

