Українська
StringBuilder, Unicode і регулярні вирази
Клас StringBuilder
Оскільки рядки незмінні, кожна операція s += "..." створює новий рядок і копіює в нього весь попередній текст. У циклі з тисячами повторень це означає тисячі копій, і час роботи зростає квадратично. Клас StringBuilder (простір імен System.Text) зберігає змінний буфер символів: додавання не копіює вже накопичений текст (https://learn.microsoft.com/dotnet/standard/base-types/stringbuilder).
cs
using System.Text;
var sb = new StringBuilder();
for (int i = 1; i <= 5; i++)
{
sb.Append(i * i);
if (i < 5)
{
sb.Append(", ");
}
}
sb.Insert(0, "Квадрати: ");
sb.AppendLine(".");
sb.Replace(", ", "; ");
sb.Remove(0, 3); // видалити "Ква"
string result = sb.ToString();
Console.Write(result); // драти: 1; 4; 9; 16; 25.Основні методи: Append (додати значення в кінець), AppendLine (додати з переходом на новий рядок), Insert, Remove, Replace, Clear і ToString (отримати готовий рядок). Використовуйте StringBuilder, коли рядок збирається з багатьох частин у циклі; для кількох операцій звичайна конкатенація або інтерпольований рядок простіші й не повільніші.
Культура, Unicode та регулярні вирази
Регістр і культура
Методи ToUpper, ToLower, StartsWith(string), string.Compare і Array.Sort для рядків без додаткових параметрів використовують правила поточної культури. Для українського тексту це дає правильний алфавітний порядок, а порівняння за кодами (Ordinal) – ні: у таблиці Unicode літери «Є», «І», «Ї», «Ґ» розташовані окремо від основного блоку кирилиці:
cs
string[] words = ["яблуко", "ґава", "груша", "Євген", "іній"];
// Поточна культура: груша ґава Євген іній яблуко
Array.Sort(words);
Console.WriteLine(string.Join(" ", words));
// За кодами символів: Євген груша яблуко іній ґава
Array.Sort(words, StringComparer.Ordinal);
Console.WriteLine(string.Join(" ", words));Для технічних рядків (коди, команди, ключі), які не повинні залежати від мови системи, використовують ToUpperInvariant, ToLowerInvariant і порівняння Ordinal.
Апостроф і символи Unicode
В українському тексті використовують типографський апостроф ’ (U+2019), але користувачі часто вводять ' (U+0027) або ʼ (U+02BC). Для комп’ютера це різні символи, тому "м'ята" == "м’ята" дає false. Перед порівнянням або пошуком текст нормалізують: замінюють усі варіанти апострофа одним, обрізають пробіли, зводять регістр:
cs
string input = " М'ЯТА ";
string normalized = input.Trim()
.Replace('\'', '’')
.Replace('ʼ', '’')
.ToLower();
Console.WriteLine(normalized == "м’ята"); // TrueВластивість Length рахує символи char, а не видимі знаки: символи поза основною площиною Unicode, зокрема більшість емодзі, займають два char. Для кириличного тексту кожна літера – один char.
Регулярні вирази
Для перевірки формату рядка (номер телефону, e-mail, поштовий індекс) замість ланцюжка перевірок символів можна використати регулярний вираз – шаблон тексту. Клас Regex простору імен System.Text.RegularExpressions перевіряє відповідність методом IsMatch і замінює фрагменти методом Replace (https://learn.microsoft.com/dotnet/standard/base-types/regular-expression-language-quick-reference):
cs
using System.Text.RegularExpressions;
string phone = "+380 67 123 45 67";
bool ok = Regex.IsMatch(phone,
@"^\+380 \d{2} \d{3} \d{2} \d{2}$");
Console.WriteLine(ok); // True
Console.WriteLine(Regex.Replace("a b c", @"\s+", " ")); // a b cУ шаблоні ^ і $ позначають початок і кінець рядка, \d – цифру, {2} – рівно два повторення, \s+ – один або більше пробільних символів. Шаблони записують дослівними рядками @"…", щоб не подвоювати зворотні скісні риски. Регулярні вирази потужні, але складні для читання, тому в курсі їх використовують лише для простих перевірок.