Работа со строками c windows forms

Основные операции со строками в C#: конкатенация, объединение, разделение, поиск, удаление и замена символов и подстрок, основные методы для работы со строками

Операции со строками

Последнее обновление: 05.01.2022

Объединение строк

Конкатенация строк или объединение может производиться как с помощью операции +, так и с помощью метода Concat:

string s1 = "hello";
string s2 = "world";
string s3 = s1 + " " + s2; // результат: строка "hello world"
string s4 = string.Concat(s3, "!!!"); // результат: строка "hello world!!!"

Console.WriteLine(s4);

Метод Concat является статическим методом класса string, принимающим в качестве параметров две строки. Также имеются другие версии
метода, принимающие другое количество параметров.

Для объединения строк также может использоваться метод Join:

string s5 = "apple";
string s6 = "a day";
string s7 = "keeps";
string s8 = "a doctor";
string s9 = "away";
string[] values = new string[] { s5, s6, s7, s8, s9 };

string s10 = string.Join(" ", values);
Console.WriteLine(s10); // apple a day keeps a doctor away

Метод Join также является статическим. Использованная выше версия метода получает два параметра: строку-разделитель (в данном случае пробел) и
массив строк, которые будут соединяться и разделяться разделителем.

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

Для сравнения строк применяется статический метод Compare:

string s1 = "hello";
string s2 = "world";

int result = string.Compare(s1, s2);
if (result<0)
{
    Console.WriteLine("Строка s1 перед строкой s2");
}
else if (result > 0)
{
    Console.WriteLine("Строка s1 стоит после строки s2");
}
else
{
    Console.WriteLine("Строки s1 и s2 идентичны");
}
// результатом будет "Строка s1 перед строкой s2"

Данная версия метода Compare принимает две строки и возвращает число. Если первая строка по алфавиту стоит выше второй, то возвращается число меньше нуля.
В противном случае возвращается число больше нуля. И третий случай — если строки равны, то возвращается число 0.

В данном случае так как символ h по алфавиту стоит выше символа w, то и первая строка будет стоять выше.

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

С помощью метода IndexOf мы можем определить индекс первого вхождения отдельного символа или подстроки в строке:

string s1 = "hello world";
char ch = 'o';
int indexOfChar = s1.IndexOf(ch); // равно 4
Console.WriteLine(indexOfChar);

string substring = "wor";
int indexOfSubstring = s1.IndexOf(substring); // равно 6
Console.WriteLine(indexOfSubstring);

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

Еще одна группа методов позволяет узнать начинается или заканчивается ли строка на определенную подстроку. Для этого предназначены методы
StartsWith и EndsWith. Например, в массиве строк хранится список файлов, и нам надо вывести все файлы с
расширением exe:

var files = new string[]
{
    "myapp.exe",
    "forest.jpg",
    "main.exe",
    "book.pdf",
    "river.png"
};

for (int i = 0; i < files.Length; i++)
{
    if (files[i].EndsWith(".exe"))
        Console.WriteLine(files[i]);
}

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

С помощью функции Split мы можем разделить строку на массив подстрок. В качестве параметра функция Split
принимает массив символов или строк, которые и будут служить разделителями. Например, подсчитаем количество слов в сроке,
разделив ее по пробельным символам:

string text = "И поэтому все так произошло";

string[] words = text.Split(new char[] { ' ' });

foreach (string s in words)
{
    Console.WriteLine(s);
}

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

string[] words = text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

Второй параметр StringSplitOptions.RemoveEmptyEntries говорит, что надо удалить все пустые подстроки.

Обрезка строки

Для обрезки начальных или концевых символов используется функция Trim:

string text = " hello world ";

text = text.Trim(); // результат "hello world"
text = text.Trim(new char[] { 'd', 'h' }); // результат "ello worl"

Функция Trim без параметров обрезает начальные и конечные пробелы и возвращает обрезанную строку. Чтобы явным образом указать, какие
начальные и конечные символы следует обрезать, мы можем передать в функцию массив этих символов.

Эта функция имеет частичные аналоги: функция TrimStart обрезает начальные символы, а функция TrimEnd обрезает конечные символы.

Обрезать определенную часть строки позволяет функция Substring:

string text = "Хороший день";
// обрезаем начиная с третьего символа
text = text.Substring(2);
// результат "роший день"
Console.WriteLine(text);
// обрезаем сначала до последних двух символов
text = text.Substring(0, text.Length - 2);
// результат "роший де"
 Console.WriteLine(text);

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

Вставка

Для вставки одной строки в другую применяется функция Insert:

string text = "Хороший день";
string substring = "замечательный ";

text = text.Insert(8, substring);
Console.WriteLine(text);	// Хороший замечательный день

Первым параметром в функции Insert является индекс, по которому надо вставлять подстроку, а второй параметр — собственно подстрока.

Удаление строк

Удалить часть строки помогает метод Remove:

string text = "Хороший день";
// индекс последнего символа
int ind = text.Length - 1;
// вырезаем последний символ
text = text.Remove(ind); 
Console.WriteLine(text);    // Хороший ден

// вырезаем первые два символа
text = text.Remove(0, 2);
Console.WriteLine(text);    // роший ден

Первая версия метода Remove принимает индекс в строке, начиная с которого надо удалить все символы. Вторая версия принимает еще один параметр — сколько
символов надо удалить.

Замена

Чтобы заменить один символ или подстроку на другую, применяется метод Replace:

string text = "хороший день";

text = text.Replace("хороший", "плохой");
Console.WriteLine(text);	// плохой день

text = text.Replace("о", "");
Console.WriteLine(text);	// плхй день

Во втором случае применения функции Replace строка из одного символа «о» заменяется на пустую строку, то есть фактически удаляется из текста.
Подобным способом легко удалять какой-то определенный текст в строках.

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

Для приведения строки к верхнему и нижнему регистру используются соответственно функции ToUpper() и
ToLower():

string hello = "Hello world!";

Console.WriteLine(hello.ToLower()); // hello world!
Console.WriteLine(hello.ToUpper()); // HELLO WORLD!

Тема работы со строками является одной из значимых при изучении любого языка программирования. В приведенном материале будут рассмотрены как базовые концепции работы со строками, так и расширенные возможности, предоставляемые C#.

  • Знакомство со строками в C#
  • Создание и инициализация объекта класса String
  • Базовый API для работы со строками
    • Объединение строк. Оператор +, методы Concat и Join
    • Поиск и извлечение элементов из строки. Оператор [], методы IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny, Substring
    • Сравнение срок
    • Модификация срок
    • Методы и свойства общего назначения
  • Форматирование строк
    • Представление чисел
    • Представление даты и времени
  • $ — интерполяция строк
  • Управляющие символы (литералы)
  • @ – буквальный идентификатор
  • Класс StringBuilder

Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.

За представление строк в C# отвечает класс System.String. В коде, для объявления переменной соответствующего типа, предпочтительно использовать следующий вариант написания: string – с маленькой буквы. Это ключевое слово языка, используя которое можно объявлять строковые переменные, также как int является псевдонимом для  System.Int32, а bool – для System.Boolean.

string s1 = "Hello, World!";
Console.WriteLine(s1);

Допустимо объявление строковых переменных через ключевое слово var:

var s2 = "Create by var";
Console.WriteLine(s2);

Для объединения строк используется оператор +:

string s3 = "Hello, ";
string s4 = s3 + "John!";
Console.WriteLine(s4);

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

Создание и инициализация объекта класса String

Существует несколько способов создать объект класса String и проинициализировать его. Рассмотрим варианты, которые доступны в C#. Наиболее распространенный способ сделать эту операцию – это присвоить строковое значение переменной без явного вызова конструктора, так, как мы это делали в предыдущем разделе:

string s5 = "test1";
var s6 = "test2";

Для дословного представления строки, для того чтобы проигнорировать управляющие последовательности, используйте префикс @ перед значением. Сравните вывод следующей конструкции:

Console.WriteLine("first linenSecond line");

С вариантом:

Console.WriteLine(@"first linenSecond line");

Если требуется подготовить строковое значение с использованием набора переменных, то можно воспользоваться статическим методом Format класса String, либо префиксом $:

int age = 27;
Console.WriteLine(String.Format("Age: {0}", age));
Console.WriteLine("");
Console.WriteLine($"Age: {age}");
Console.WriteLine("");

Можно явно вызвать конструктор типа c передачей в него параметров. Самый простой вариант – это передать строку:

string s7 = new string("test3");

В качестве параметра может выступать массив Char элементов:

char[] charArray = {'H', 'e', 'l', 'l', 'o'};
string s8 = new string(charArray);

Ещё вариант – это указать элемент типа char и количество раз, которое его нужно повторить:

string s9 = new string('O', 10); // "OOOOOOOOOO"

Для создания строки также можно использовать указатели на Char* и SByte*, но в данном уроке эта тема рассматриваться не будет.

Базовый API для работы со строками

В рамках данного раздела рассмотрим наиболее интересные и полезные методы и свойства класса String.

Объединение строк. Оператор +, методы Concat и Join

Сцеплять строки между собой можно с помощью оператора +, при этом, в результате объединения, будет создан новый объект:

string s10 = "Area";
string s11 = " 51";
Console.WriteLine("Concat by +: " + s10 + s11);

В составе API, который предоставляет System.String, есть метод Concat, который может выполнять ту же работу:

Console.WriteLine("Concat by Concat(): " + string.Concat(s10, s11));

Метод Concat позволяет объединить до четырех строк через прямое перечисление. Если нужно таким образом объединить больше строковых переменных и значений, то используйте оператор +. Полезным свойством Concat является то, что он может принять на вход массив элементов типа String  и объединить их:

string[] sArr1 = {"First ", "Second ", "Third "};
Console.WriteLine(string.Concat(sArr1));

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

string[] sArr2 = {"First", "Second", "Third"};
Console.WriteLine("Join elements in array by Join() with space: " + string.Join(" ", sArr2));

В качестве разделителя можно использовать любую строку:

Console.WriteLine("Join elements in array by Join() with <->: " + string.Join("<->", sArr2));

Поиск и извлечение элементов из строки. Оператор [], методы IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny, Substring

Для получения символа из строки с конкретной позиции можно использовать синтаксис подобный тому, что применяется при работе с массивами – через квадратные скобки []:

string s12 = "Hello";
Console.WriteLine("Get element by index s12[3]: " + s12[3]);

Для решения обратной задачи: поиск индекса первого (последнего) вхождения элемента или сроки в данной строке используются методы IndexOf, IndexOfAny и LastIndexOf, LastIndexOfAny.

В таблице ниже перечислены некоторые из предоставляемых System.String вариантов этих методов.

Метод

Описание

IndexOf(Char)

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

IndexOf(Char, Int32)

Возвращает индекс первого вхождения символа начиная с заданной позиции.

IndexOf(Char, Int32, Int32)

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

IndexOf(String)
IndexOf(String, Int32)
IndexOf(String, Int32, Int32)

Назначение методов совпадает с перечисленными выше, но поиск выполняется для строки.

IndexOfAny(Char[])
IndexOfAny(Char[], Int32)
IndexOfAny(Char[], Int32, Int32)

Назначение методов совпадает с перечисленными выше, но выполняется поиск индекса первого вхождения любого из переданных в массиве элементов.

LastIndexOf([Char | String])
LastIndexOf([Char | String], Int32)
LastIndexOf([Char | String], Int32, Int32)

Возвращает индекс последнего вхождения символа или строки. Можно задавать индекс, с которого начинать поиск и количество проверяемых позиций. [Char | String] – означает Char или String

LastIndexOfAny(Char[])
LastIndexOfAny(Char[], Int32)
LastIndexOfAny(Char[], Int32, Int32)

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

// s1 = "Hello, World!"
// Поиск первого вхождения символа 'r'
Console.WriteLine("Index of 'r': " + s1.IndexOf('r'));
// Поиск первого вхождения символа 'l' начиная с позиции 4
Console.WriteLine("Index of 'l', start at 4: " + s1.IndexOf('l', 4));
// Поиск первого вхождения строки "World"
Console.WriteLine("Index of "World": " + s1.IndexOf("World"));
// Поиск первого вхождения символа из набора ['o', 'd', ',']
Console.WriteLine("Index of pos of any symbol in array: " + s1.IndexOfAny(new char[] {'o', 'd', ','}));

// Поиск последнего вхождения символа 'l'
Console.WriteLine("Last index of 'l': " + s1.LastIndexOf('l'));
// Поиск последнего вхождения строки "or"
Console.WriteLine("Last index of "or": " + s1.LastIndexOf("or"));
// Поиск последнего вхождения символа из набора ['o', 'd', ',']
Console.WriteLine("Last index of pos of any symbol in array: " + s1.LastIndexOfAny(new char[] {'o', 'd', ','}));

Для определения того, содержит ли данная строка указанную подстроку, а также для проверки равенства начала или конца строки заданному значению используйте методы: Contains, StartsWith и EndsWith.

Метод

Описание

Contains(Char)
Contains(String)

Возвращает True если строка содержит указанный символ или подстроки.

StartsWith(Char)
StartsWith(String)

Возвращает True если строка начинается с заданного символа или подстроки.

EndsWith(Char)
EndsWith(String)

Возвращает True если строка заканчивается на заданный символ или подстроку.

Console.WriteLine("Contains "World"? " + s1.Contains("World")); // True
Console.WriteLine("Starts with "He"? " + s1.StartsWith("He")); // True
Console.WriteLine("Ends with "ld"? " + s1.EndsWith("ld")); // False

Задачу извлечения подстроки из данной строки решает метод SubString:

Метод

Описание

Substring(Int32)

Возвращает подстроку начиная с указанной позиции и до конца исходной строки.

Substring(Int32, Int32)

Возвращает подстроку начиная с указанной позиции с заданной длины.

Console.WriteLine("Substring start at pos 7: " + s1.Substring(7));  // World!
Console.WriteLine("Substring start at pos 7 (4 chars): " + s1.Substring(7, 4)); // Worl

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

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

string t1 = "John";
string t2 = "John";
string t3 = "Mary";
Console.WriteLine("t1 == t2: " + (t1 == t2));   // True
Console.WriteLine("t1 != t2: " + (t1 != t2));   // False
Console.WriteLine("t1 == t3: " + (t1 == t3));   // False

Для сравнения также можно использовать метод Equals, но это менее удобный вариант:

Console.WriteLine("Equals method: t1.Equals(t2)" + t1.Equals(t2));   // True
Console.WriteLine("Equals method: t1.Equals(t3)" + t1.Equals(t3));   // False

Модификация срок

Класс String предоставляет довольно большое количество инструментов для изменения строк. 

Вставка строки в исходную в заданную позицию осуществляется с помощью метода Insert:

Console.WriteLine("Insert: " + "26".Insert(1, "[4]")); // 2[4]6

Для приведения строки к заданной длине с выравниванием по левому (правому) краю с заполнением недостающих символов пробелами используются методы PadLeft и PadRight:

Console.WriteLine("PadLeft: ");
Console.WriteLine("some string".PadLeft(15)); // "    some string"
Console.WriteLine("some string".PadLeft(15, '*')); // "****some string"
Console.WriteLine("PadRight: ");
Console.WriteLine("some string".PadRight(15)); // "some string    "
Console.WriteLine("some string".PadRight(15, '*')); // "some string****"

Метод Remove удаляет подстроку из исходной строки. Возможны два варианта использования:

Метод

Описание

Remove(Int32)

Удаляет все символы начиная с заданного и до конца строки.

Remove(Int32, Int32)

Удаляет с указанной позиции заданное число символов.

Console.WriteLine("Remove demo1: " + "Hello".Remove(2));
Console.WriteLine("Remove demo2: " + "Hello".Remove(2, 2));

Замена элементов строки производится с помощью метода Replace. Наиболее часто используемые варианты – это замена символа на символ и строки на подстроку:

Console.WriteLine("Hello, World!".Replace('!', '.')); // Hello, World.
Console.WriteLine("Hello, World!".Replace("World", "John")); // Hello, John!

Для преобразования строки к верхнему регистру используйте метод ToUpper(), к нижнему – ToLower():

Console.WriteLine("Hello, World!".ToUpper()); // HELLO, WORLD!
Console.WriteLine("Hello, World!".ToLower()); // hello, world!

За удаление начальных и конечных символов отвечают методы, начинающиеся на Trim (см. таблицу ниже).

Метод

Описание

Trim()

Удаляет символы пробелы из начала и конца строки.

Trim(Char)

Удаляет экземпляры символа из начала и конца строки.

Trim(Char[])

Удаляет экземпляры символов из начала и конца строки.

TrimStart()
TrimStart(Char)
TrimStart(Char[])

Удаляет экземпляры символов из начала строки.

TrimEnd()
TrimEnd(Char)
TrimEnd(Char[])

Удаляет экземпляры символов из конца строки.

Console.WriteLine("   hello   ".Trim());    // "hello"
Console.WriteLine("***hello---".Trim('*'));    // "hello---"
Console.WriteLine("***hello---".Trim(new char[] {'*', '-'}));    // "hello"
Console.WriteLine("   hello   ".TrimStart());   // "hello   "           
Console.WriteLine("   hello   ".TrimEnd()); // "   hello"

Методы и свойства общего назначения

Рассмотрим некоторые из полезных методов и свойств, которые не вошли в приведенные выше группы.

System.Length – возвращает длину строки:

Console.WriteLine("Hello".Length); // 5

System.Split() – разделяет заданную строку на подстроки, в качестве разделителя используется указанный через параметр символ (или группа символов):

foreach(var s in "1 2 3".Split(' '))
Console.WriteLine(s);

foreach(var s in "1 2 3-4-5-6".Split(new char[]{' ', '-'}))
Console.WriteLine(s);

System.Empty – возвращает пустую строку.

Форматирование строк

Под форматированием строк, в рамках данного раздела, понимается встраивание в строку различных элементом  (число, дата и т.п.), представленных в заданном формате. Форматирование можно осуществлять с помощью метода ToString с передачей в него нужных описателей, метода Format, который, в качестве аргументов, получает строку со специальными вставками, определяющими представление элементов и непосредственно сами элементы.

Для начала рассмотрим на нескольких примерах работу с этими методоми:

// ToString
Console.WriteLine(12345.ToString("X"));


// String.Format
Console.WriteLine(string.Format("value: {0}", 1.23456));
Console.WriteLine(string.Format("value: {0:F}", 1.23456));
Console.WriteLine(string.Format("value: {0:d}", 1.23456));
        

// WriteLine без использования String.Format
Console.WriteLine("value: {0}", 1.23456);   // 1,23456
Console.WriteLine("value: {0:F}", 1.23456); // 1.235
Console.WriteLine("date: {0:d}", DateTime.Now); // 07.09.2020

Эта функциональность также доступна для методов  StringBuilder.AppendFormatTextWriter.WriteLineDebug.WriteLine, методов из Trace, которые выводят текстовые сообщения, например: Trace.TraceError и метод TraceSource.TraceInformation.

Каждый элемент форматирования представляется следующим образом:

{index[,alignment][:formatString]}

где index – это индекс элемента, которым будет замещена данная конструкция;

alignment – выравнивание;

formatString – формат.

Ниже приведены примеры использования элементов форматирования:

Console.WriteLine("Only index: {0}", 123); // Only index: 123
Console.WriteLine("Index with alignment: {0,-5}{1,5}", 123, 456); // Index with alignment: 123    456
Console.WriteLine("Index with format: 0x{0:X}", 123); // Index with format: 0x7B

Представление чисел

Для представления чисел используются следующие описатели формата (список не полный, более детальную информацию можете найти в официальной документации):

Описатель формата

Описание

“C” или “c”

Представление валюты.

“D” или “d”

Представление целого числа.

“E” или “e”

Представление числа в экспоненциальном виде.

“F” или “f”

Представление числа в формате с плавающей точкой.

“P” или “p”

Представление процентов, выводит число умноженное на 100 со знаком процента.

“X” или “x”

Шестнадцатеричное представление.

“0”

Заместитель нуля.

“#”

Заместитель цифры.

“.”

Разделитель целой и дробной части.

Примеры использования описателей формата для чисел:

Console.WriteLine("C symbol: {0:C}", 123);      // 123,00 ₽
Console.WriteLine("D symbol: {0:D5}", 123);     // 00123
Console.WriteLine("E symbol: {0:E}", 123456789);// 1,234568E+008
Console.WriteLine("F symbol: {0:F2}", 123.4567);// 123,46
Console.WriteLine("P symbol: {0:P}", 0.123);    // 123,46
Console.WriteLine("X symbol: 0x{0:X}", 567);    // 0x237
Console.WriteLine("0 symbol: {0:000.00}", 12.6789);// 012,68
Console.WriteLine("# symbol: {0:##}", 14.6789); // 15

Представление даты и времени

Для представления даты и времени используются следующие описатели формата (список не полный, более детальную информацию можете найти в официальной документации):

Описатель формата

Описание

“d”

Сокращенный формат даты

“D”

Полный формат даты

“f”, “F”

Полный формат даты и времени с коротким (полным) форматом времени

“g”, “G”

Общий формат даты и времени с коротким (полным) форматом времени

“t”

Короткий формат времени

“T”

Полный формат времени

“M”, “m”

Шаблон дней месяца.

“Y”, “y”

Шаблон месяца года.

Примеры использования описателей формата для даты и времени:

Console.WriteLine("d symbol: {0:d}", DateTime.Now);
Console.WriteLine("D symbol: {0:D}", DateTime.Now);
Console.WriteLine("f symbol: {0:f}", DateTime.Now);
Console.WriteLine("F symbol: {0:F}", DateTime.Now);
Console.WriteLine("g symbol: {0:g}", DateTime.Now);
Console.WriteLine("G symbol: {0:G}", DateTime.Now);
Console.WriteLine("t symbol: {0:t}", DateTime.Now);
Console.WriteLine("T symbol: {0:T}", DateTime.Now);
Console.WriteLine("{0:yyyy-MM-dd}", DateTime.Now);
Console.WriteLine("{0:dd/MM/yy}", DateTime.Now);
Console.WriteLine("{0:dd/MM/yy HH:mm:ss}", DateTime.Now);

$ — интерполяция строк

Начиная с C# 6 появилась возможность строить интерполированную строку, формат которой позволяет более просто, по сравнению с составным форматированием, рассмотренным нами выше, создавать строки. Интерполированная строка содержит специальные выражения интерполяции, они похожи на элементы форматирования. Выражения интерполяции имеют следующий вид:

{<interpolationExpression>[,<alignment>][:<formatString>]}

где interpolationExpression – элемент, значение, которого будет интегрироваться в строку;

alignment – выравнивание;

formatString – формат (см. форматирование строк).

Примеры работы с интерполированной строкой:

int n1 = 45678;
double d1 = 123.34567;
bool b1 = true;
string sv = "test";
Console.WriteLine($"int val: {n1}, double val: {d1:#.###}");
Console.WriteLine($"bool val: {b1}, string val: {sv}");

Управляющие символы (литералы)

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

Управляющий символ

Описание

a

Звуковой сигнал

b

Возврат на одну позицию

f

Перевод страницы

n

Новая строка

r

Возврат каретки

t

Горизонтальная табуляция

v

Вертикальная табуляция

Пустой символ

Одинарная кавычка

Двойная кавычка

\

Обратная косая черта

Пример использования управляющих символов:

Console.WriteLine("aName:t"John"nAge:t"27"");

@ – буквальный идентификатор

Еще один элемент, который можно использовать при создании срок – это буквальный идентификатор @. Если его поставить перед строкой, то она будет интерпретироваться буквально, в ней, escape-последовательности представляются без преобразования.

Пример работы с буквальным идентификатором:

Console.WriteLine(@"escape is not work: atnx1234");

Класс StringBuilder

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

Если для построения итоговой строки использовать оператор +, как это сделано в примере ниже, то при выполнении операции += каждый раз будет создавать новый объект класса String в памяти. Если количество таких присваиваний будет достаточно большим, то программа может аварийно завершиться из-за нехватки памяти, либо занять ее в очень большом объеме. Это происходит из-за того, что сборщик мусора не будет успевать уничтожать неиспользуемые объекты, которые создаются с большой скоростью. Пример реализации с использованием оператора +:

string outString = "";
for(int i = 0; i < 10; i++)
{
   outString += i.ToString() + " - ";
}
Console.WriteLine(outString);

Более эффективным решением будет использование StringBuilder:

StringBuilder sb = new StringBuilder();
for(int i = 0; i < 10; i++)
{
    sb.Append(i.ToString());
    sb.Append(" - ");
}
outString = sb.ToString();
Console.WriteLine(outString);

Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.

Содержание

  • Основные методы работы со строками в C#
    • Сравнение строк в C#
    • Сравнение строк в C# без учёта региональных настроек
    • Проверка вхождения подстроки в строку в C#
    • Объединение строк в C# (конкатенация строк)
    • Объединение строк с использованием разделителя в C#
    • Копирование строк в C#
    • Проверка совпадения строк в C#
    • Форматирование строк в C#
    • Поиск в строках C#
    • Вставка подстроки в строку C#
    • Замена символов и подстрок в строках C#
    • Разделение строк на подстроки в C#
    • Извлечение подстрок из строки в C#
    • Изменение регистра строк в C#
    • Обрезка строк в C#
  • Итого

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

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

Функциональность класса System.String наиболее полно раскрывается через его методы, основными из которых являются следующие:

  • Compare — сравнивает две строки с учетом текущих региональных настроек (локали) пользователя
  • CompareOrdinal— сравнивает две строки без учета локали
  • Contains— проверяет, содержится ли заданная подстрока в строке
  • Concat— объединяет строки
  • CopyTo— копирует часть строки, начиная с определенного индекса, в массив
  • EndsWith— проверяет совпадает ли конец строки с подстрокой
  • Format— форматирует строку
  • IndexOf— находит индекс первого вхождения символа или подстроки в строке
  • Insert— вставляет в строку подстроку
  • Join— соединяет элементы массива строк
  • LastIndexOf— находит индекс последнего вхождения символа или подстроки в строке
  • Replace— заменяет в строке символ или подстроку другим символом или подстрокой
  • Split— разделяет одну строку на массив строк
  • Substring— извлекает из строки подстроку, начиная с указанной позиции
  • ToLower— переводит все символы строки в нижний регистр
  • ToUpper— переводит все символы строки в верхний регистр
  • Trim— удаляет начальные и конечные пробелы из строки

Рассмотрим представленные методы более подробно.

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

Для сравнения двух строк в C# удобно использовать метод Compare.

public static int Compare (string strA, string strB);

Результатом выполнения метода является целое число Int32. Это число означает следующее:

Результат Compare Что означает
Меньше нуля strA предшествует strB в порядке сортировки (стока strA меньше строки strB).
Нуль strA занимает ту же позицию в порядке сортировки, что и объект strB(строки равны)
Больше нуля strA следует за strB в порядке сортировки (стока strA больше строки strB).

Например,

string s1 = "Строка";
string s2 = "Строка";
int res = string.Compare(s1, s2);
Console.WriteLine(res);

Вернет значение 0 так как строки равны.

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

public static int Compare(String? strA, String? strB, bool ignoreCase);

или определить свои настройки сравнения строк, используя следующий вариант метода Compare:

public static int Compare(String? strA, String? strB, StringComparison comparisonType);

Несмотря на то, что метод Compare по умолчанию предназначен для сравнения строк с учётом локали, используя перегруженные версии метода, можно сравнивать строки и без учёта региональных настроек, например, воспользовавшись вот таким способом:

string.Compare(s1, s2, true, System.Globalization.CultureInfo.InvariantCulture);

Сравнение строк в C# без учёта региональных настроек

Метод CompareOrdinal сравнивает два объекта String, оценивая числовые значения соответствующих объектов Char в каждой строке. Результат выполнения метода такой же, как и у предыдущего метода Compare (см. таблицу выше).

Проверка вхождения подстроки в строку в C#

Метод Containsпроверяет, входит ли заданная подстрока в строку. Этот метод не статический, поэтому использовать его необходимо только после создания объекта, то есть следующим образом:

string s1 = "Строка";
string s2 = "ока";

if (s1.Contains(s2))
{
    Console.WriteLine($"Строка {s1} содержит подстроку {s2}");
}
else
{
    Console.WriteLine($"Строка {s1} не содержит подстроку {s2}");
}

В примере выше мы проверяем содержится ли подстрока "ока" в строке "Строка". Очевидно, что результатом выполнения метода будет true.

Объединение строк в C# (конкатенация строк)

Для объединения строк в C# удобно использовать метод Concat. Этот метод принимает два или более параметров, позволяя объединять не только строки, но и строковые представления любых объектов. Например:

string s1 = "Hello";
string s2 = " world";
string s3 = string.Concat(s1, s2);
Console.WriteLine(s3);

Также возможно объединять и массивы строк:

string[] strArr = new string[3] { "Это", "массив", "строк" };
string s4 = string.Concat(strArr);
Console.WriteLine(s4);

Объединение строк с использованием разделителя в C#

Для того, чтобы объединить несколько строк с использованием заданного разделителе, в C# используется метод Join. В качестве входных параметров метод Join принимает массив или коллекцию строк и символ-разделитель, например:

string[] strArr = new string[3] { "Это", "массив", "строк" };
string s5 = string.Join('|', strArr);
Console.WriteLine(s5);

Для приведенного выше примера в консоли мы получим следующую объединенную строку:

Копирование строк в C#

Для копирования строк в C# можно воспользоваться не статическим методом CopyTo. Этот метод копирует из строки часть символов, начиная с заданной позиции, и вставляет их в массив символов, также с указанной позиции. Сигнатура метода следующая:

(int sourceIndex, char[] destination, int destinationIndex, int count);

Для того, чтобы продемонстрировать работу метода, воспользуемся следующим примером:

char[] charArr = new char[] { 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' };
string s6 = "string";
s6.CopyTo(2, charArr, 0, 4);
Console.WriteLine(charArr);

в результате выполнения мы получим следующий вывод в консоли:

В этом примере из строки s6 копируется 4 символа, начиная с символа с индексом 2 (так как нумерация начинается с нуля, то первый копируемый символ r) и вставляется в массив charArr, начиная с первого элемента (с индексом 0)

Также можно воспользоваться статическим методом Copy для создания полной копии строки:

string s6 = "string";
string s7 = string.Copy(s6);
Console.WriteLine(s7);

Проверка совпадения строк в C#

Достаточно часто при работе со строками приходится проверять вхождение одной подстроки в другую. Для выполнения проверки совпадения строк и подстрок в C# можно воспользоваться двумя методами:

public bool EndsWith(String value);
public bool StartsWith(String value);

Первый метод (EndWith) проверяет заканчивается ли проверяемая строка подстрокой value, а второй, соответственно, проводит проверку на наличие подстроки value в начале строки. Оба метода имеют перегрузки. Пример:

string s6 = "string";
if (s6.StartsWith("str"))
    Console.WriteLine("Найдено совпадение подстроки "str" в начале строки");
if (s6.EndsWith("ing"))
    Console.WriteLine("Найдено совпадение подстроки "ing" в конце строки");

Форматирование строк в C#

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

double value = 7.123456789;
double value2 = 7.12;
string s8 = string.Format("Строка для форматирования. Первое число {0},  второе число {1}", value, value2);
Console.WriteLine(s8);

Результатом будет следующая строка:

Строка для форматирования. Первое число 7,123456789, второе число 7,12

Поиск в строках C#

Ещё одной частой задачей при работе со строками в C# является поиск символов и подстрок в строках. Поиск в строке можно осуществить, в том числе, с использованием метода IndexOf, имеющего несколько перегрузок:

public int IndexOf(String value, StringComparison comparisonType);
public int IndexOf(String value, int startIndex, StringComparison comparisonType);
public int IndexOf(String value, int startIndex, int count, StringComparison comparisonType);
public int IndexOf(String value, int startIndex, int count);
public int IndexOf(String value);
public int IndexOf(char value, StringComparison comparisonType);
public int IndexOf(char value, int startIndex, int count);
public int IndexOf(char value, int startIndex);
public int IndexOf(char value);

Этот метод возвращает индекс первого вхождения указанного символа или подстроки в строку. Например,

string s9 = "Строка для поиска символов и подстрок";
int index = s9.IndexOf("о");
if (index > -1)
    Console.WriteLine("Индекс первого вхождения символа в строку {0}", index);
index = s9.IndexOf("сим");
if (index > -1)
    Console.WriteLine("Индекс первого символа искомой подстроки {0}", index);

Результатом выполнения будут следующие строки в консоли:

Индекс первого вхождения символа в строку 3

Индекс первого символа искомой подстроки 18

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

public int LastIndexOf(char value, int startIndex, int count);
public int LastIndexOf(char value, int startIndex);
public int LastIndexOf(String value, StringComparison comparisonType);
public int LastIndexOf(String value, int startIndex, StringComparison comparisonType);
public int LastIndexOf(char value);
public int LastIndexOf(String value, int startIndex, int count);
public int LastIndexOf(String value, int startIndex);
public int LastIndexOf(String value);
public int LastIndexOf(String value, int startIndex, int count, StringComparison comparisonType);

Вставка подстроки в строку C#

Для вставки одной строки в другую в C# можно воспользоваться методом Insert:

public String Insert(int startIndex, String value);

Этот метод вставляет в строку, начиная с индекса startIndex подстроку value и возвращает в результате новый экземпляр строки. Например,

string s10 = "Hello ";
string s11 = s10.Insert(6, "world");
Console.WriteLine(s11);

Результат

Замена символов и подстрок в строках C#

Для замены символов и подстрок в строках C# используется метод Replace:

public String Replace(char oldChar, char newChar);
public String Replace(String oldValue, String? newValue);
public String Replace(String oldValue, String? newValue, bool ignoreCase, CultureInfo? culture);
public String Replace(String oldValue, String? newValue, StringComparison comparisonType);

Например, заменим все символы o с строке на символы А:

string s12 = "Исходная строка для замены всех символов о на символы А";
string s13 = s12.Replace('о', 'А');
Console.WriteLine(s13);

Результат

ИсхАдная стрАка для замены всех симвАлАв А на симвАлы А

Разделение строк на подстроки в C#

Разделение строк на подстроки в C# также является достаточно частой задачей в программировании. Для этого можно воспользоваться методом Split

public String[] Split(String[]? separator, int count, StringSplitOptions options);
public String[] Split(String? separator, int count, StringSplitOptions options = StringSplitOptions.None);
public String[] Split(String[]? separator, StringSplitOptions options);
public String[] Split(char[]? separator, int count, StringSplitOptions options);
public String[] Split(String? separator, StringSplitOptions options = StringSplitOptions.None);
public String[] Split(char[]? separator, StringSplitOptions options);
public String[] Split(char separator, StringSplitOptions options = StringSplitOptions.None);
public String[] Split(params char[]? separator);
public String[] Split(char[]? separator, int count);
public String[] Split(char separator, int count, StringSplitOptions options = StringSplitOptions.None);

В качестве параметров метод Split принимает один или несколько символов (Char), используемых в качестве разделителя, а на выходе возвращает массив строк.  Рассмотрим работу метода Split на примере

string s14 = "Эта строка, которая будет разделена на подстроки с использованием двух разделителей";
string[] res = s14.Split(new char[] { ' ', ',' });
foreach (string s in res)
{
    Console.WriteLine(s);
}

Здесь в качестве разделителей мы используем два символа — пробел и запятую. Результатом выполнения кода будет следующий вывод в консоли:

Эта

строка

которая

будет

разделена

на

подстроки

с

использованием

двух

разделителей

Извлечение подстрок из строки в C#

Для извлечения подстрок из строки используется метод Substring:

public String Substring(int startIndex);
public String Substring(int startIndex, int length);

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

Пример использования метода представлен ниже:

string s15 = "hello world";
string s16 = s15.Substring(6);
string s17 = s15.Substring(7, 3);
Console.WriteLine(s16);
Console.WriteLine(s17);

Результат выполнения

Изменение регистра строк в C#

Для изменения регистра символов в строке в C# можно воспользоваться двумя методами:

public String ToLower();
public String ToLower(CultureInfo? culture);
public String ToUpper();
public String ToUpper(CultureInfo? culture);

Метод ToLower меняет регистр всех символов в строке на нижний, а метод ToUpper,  напротив — меняет регистр всех символов в строке на верхний. Пример

string s15 = "HelLo World";
string s16 = s15.ToLower();
string s17 = s15.ToUpper();
Console.WriteLine(s16);
Console.WriteLine(s17);

Результат выполнения

Обрезка строк в C#

Иногда требуется избавиться в строке от лишних символов в начале, в конце или одновременно и вначале и в конце. «Лишними» могут быть как обычные проблелы, так и прочие символы. Для обрезки строки в C# можно воспользоваться методами Trim*:

public String Trim();
public String Trim(char trimChar);
public String Trim(params char[]? trimChars);
public String TrimEnd(char trimChar);
public String TrimEnd(params char[]? trimChars);
public String TrimStart();
public String TrimStart(char trimChar);
public String TrimStart(params char[]? trimChars);

По названию метода можно понять смысл его работы. Так, если используется метод Trim(), то обрезка строки происходит и сначала и с конца, если же используется TrimEnd(), то строка обрезается только с конца. При этом, если используется версия метода без параметров, то из строки удаляются лидирующие или замыкающие пробелы, иначе — определенные в параметрах метода символы. Например,

string s15 = " HelLo World ";
string s16 = s15.Trim(); //обрезаем пробелы
string s17 = s16.Trim(new char[] {'H', 'd'}); //обрезаем заданные символы
Console.WriteLine(s16);
Console.WriteLine(s17);

Итого

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

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Variables:

The variable is a container of information that can change its value. It provides the opportunity for:

  • Keeping information; 
  • Extracting the saved information; 
  • Modification of the saved information. 

Programming in C Sharp is related to the constant use of variables in which data is stored and processed.

Characteristics of the variables — the variables are characterized by:

  • Name (identifier), e.g. age; 
  • Type (the information stored therein), eg int; 
  • Value (saved information), for example 25. 


A variable is a named memory area in which a value of a given type is available in the program under its name. Variables can be stored directly in the program memory (in the stack) or in the dynamic memory that stores larger objects (for example, character strings and arrays).

Naming a variable:

When we want the compiler to assign an area to the memory for some information used in our program, we need to assign a name to it. It serves as an identifier and allows us to refer to the required area of memory.

The name of the variables can be any of our choice, but we have to follow certain rules:

  • Variable names are formed by the letters a-z, A-Z, digits 0-9, and the ‘_’ symbol. 
  • Variable names cannot start with a digit. 
  • Variable names cannot match a C# reserved keyword. 

The following table lists all keywords in C #.

abstract delegate if override void
as do implicit params struct while
base double in private switch
bool else int protect this
break enum interface public throw
byte event internal readonly true
case explicit is ref try typeof
catch extern lock return unit
char false long sbyte ulong
checked finally namespace sealed unchecked
class fixed new short unsafe
const float null sizeof ushort
continue for object stachalloc using
decimal foreach operator static virtual
default goto out string volatile

Strings:

Strings are a series of symbols. They are declared with the keyword string in C#. Their default value is null. Strings are enclosed in double quotes. Various word-processing operations can be performed on them: concatenation, separating by a separator, searching, substitution, and others.

Boolean expressions:

Boolean type is declared with the keyword bool. It has two values that can be accepted — true and false. The default value is false. It is most often used to store the result of calculating logical expressions.

Sample tasks:

1) Create Windows Forms Application which shows the cursor coordinates wen moving on the form. Logically separate the form to for quadrants, depending on that in which quadrant is the cursor, change the title of the form to: TopRight, TopLeft, BottomRight, BottomLeft.

Solutioin:

Create new Windows Form Application project.

Add Label control to the form and name it lCoords.

Double click on the form and in its Load event make the label control not visible:

private void Form1_Load(object sender, EventArgs e)
{
   lCoords.Visible = false;
}

From the form designer select the form go to properties, find and click on the Lightening sign to open the events menu. Find and double click on Mouse Move event:

In the generated event add the following code:

int xMousePoint, yMousePoint;

xMousePoint = e.X;
yMousePoint = e.Y;

lCoords.Text = "X: " + xMousePoint + "n Y: " + yMousePoint;
Point mousePoint = new Point(e.X + 12, e.Y + 12);
lCoords.Location = mousePoint;
lCoords.Show();

if (e.Y < this.Height / 2)
   this.Text = "Top";
else
   this.Text = "Bottom";

if (e.X < this.Width / 2)
   this.Text = this.Text + "Left";
else
   this.Text = this.Text + "Right";

This code captures cursor coordinates and writes them to the Text property of the Label. The location of the cursor is set to the label control so it can be positioned next to the cursor.

Checks are carried out in which part of the form the mouse cursor is and the corresponding text in the title of the form is displayed if the condition is fulfilled.

2) Create Windows Forms Application which shows the coordinates of the cursor in the title bar of the form. When the cursor is in one of the four angles of the form the title of the form to be changed as follows: Top Left corner or Top Right corner or Bottom Left corner or Bottom Right corner.

Solution:

Create new Windows application project.

Select the form, find and double click on the Mouse Move event. Add the following code to the event:

int xMousePoint, yMousePoint;

xMousePoint = e.X;
            yMousePoint = e.Y;

this.Text = "X: " + xMousePoint + "   Y: " + yMousePoint;
Point mousePoint = new Point(e.X + 12, e.Y + 12);

if (e.X == 0 && e.Y == 0)
   this.Text = "Top Left corner";

if (e.X == (this.Width - 17) && e.Y == 0)
   this.Text = "Top Right corner";

if (e.X == 0 && e.Y == (this.Width - 40))
   this.Text = "Bottom Left corner";

if (e.X == (this.Width - 17) && e.Y == (this.Width - 40))
   this.Text = "Bottom Right corner";

3) Create Windows Forms Application that performs the following string actions: exchange two words separated by a specific separator, validation of strings, regular expressions, anagrams and cryptogram.

Solution:

Create new Windows Forms Application project.

Design the form as shown on the picture:

In “GroupBox “String Functions” and name controls as shown:

  • TextBox – tbName;
  • Label1 – lGreetings;
  • Button – bSayHi.

Double click on the button, and its click event add the following code:

string ch;
string digits = "0123456789";
bool ok = true;

tbSocSecNum.Text = tbSocSecNum.Text.Replace("-", "");

if (tbSocSecNum.Text.Length < 9 || tbSocSecNum.Text.Length > 9)
   ok = false;
else
{
   int i = 0;

   while (i < 9)
   {
      ch = tbSocSecNum.Text.Substring(i, 1);

      if (!digits.Contains(ch))
         ok = false;

      i++;
   }
}
lSocSecNumShow.Text = ok.ToString();

The code checks if the entered value in the text box is number with nine characters length. If not a bool variable is set to false. If length is nine characters then a loop is created to check if each of the digits in the number is valid. If not valid then the bool variable ok is set to false. At the end the label text is set to the bool value.

In GrupBox „Regular Expressions” and name controls as shown:

— TextBox – tbSocNum;

— Label3 – lSocNum.

Select the TextBox control, find the KeyPress event and double click on it. Add the following code:

if (e.KeyChar == (char)Keys.Enter)
{
   string soc = tbSocNum.Text;
   Regex socReg = new Regex("[0-9]{9}");
   Match m = socReg.Match(soc);

   if (m.ToString() == soc)
      lSocNum.Text = soc + " - is А nvalid social security number";
   else
      lSocNum.Text = soc + " - is NOT a nvalid social security number";
}

The same check as above is done with regular expression.

In GrupBox „Anagrams” and name controls as shown:

  • TextBox – tbWord;
  • Label4 – lAnagram.

Open the source code file and add the following functions under the form constructor.

private string[] SplitString(string sWord)
{
   int iI;
   string[] sLetters = new string[sWord.Length];

   for (iI = 0; iI < sWord.Length; iI++)
      sLetters[iI] = sWord.Substring(iI, 1);

   return sLetters;
}
private void Shuffle(string[] sLetters)
{
    int iI, iP;
    string sTemp;

    Random rndLetter =new Random();

    for (iI = 0; iI <= sLetters.Length - 1; iI++)
    {
        iP = rndLetter.Next(sLetters.Length);
        sTemp = sLetters[iI];
        sLetters[iI] = sLetters[iP];
        sLetters[iP] = sTemp;
    }
}
private string Compress(string[] sLetters)
{
   int iI;
   string sS = "";

   for (iI = 0; iI < sLetters.Length; iI++)
      sS = sS + sLetters[iI];

   return sS;
}

In the KeyPress event of the text box add the following code:

string[] sLetters;
string word = tbWord.Text;

if (e.KeyChar == (char)Keys.Enter)
{
   sLetters = SplitString(word);
   Shuffle(sLetters);
   lAnagram.Text = Compress(sLetters);
}

In GrupBox „Cryptograms” and name controls as shown:

  • TextBox1 – tbWords;
  • TextBox2 – tbCryptogram;
  • Button – bMakeCryptogram.

Add the following function:

private string Scramble(string sS)
{
   int iI;
   char[] chChar;
   chChar = sS.ToCharArray();

   Random rndRandom = new Random();

   for (iI = 0; iI < chChar.Length; iI++)
   {
      int iRandom = rndRandom.Next(25);
      char chTemp = chChar[iI];
      chChar[iI] = chChar[iRandom];
      char check = chChar[iRandom];
      chChar[iRandom] = chTemp;
   }

   string sS2 = "";

   for (iI = 0; iI < chChar.Length; iI++)
      sS2 += chChar[iI];

   return sS2;
}

In the KeyPress event of the text box add the following code:

string sAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string sCode = Scramble(sAlphabet);
this.Text = sCode;
string sS = tbWords.Text;
sS = sS.ToUpper();

string sS2 = "";
int iI, iPos;

for (iI = 0; iI < sS.Length; iI++)
{
   string sChar = sS.Substring(iI, 1);
   iPos = sAlphabet.IndexOf(sChar);

   if (iPos >= 0)
      sS2 += sCode.Substring(iI, 1);
   else
      sS2 = sChar;
}
tbCryptogram.Text = sS2;

Self-assignments

1. Create Windows Forms Application “Age calculator” which calculates the age in years and mounts. Develop the application in two ways:

  • With 3 text box controls and one button; 
  • With DateTime picker. 

2. Create Windows Form Application “Guess the number” in which a random number is chosen every time the application is started. Construct the form with one TextBox control and one Button. When the user enters number and clicks the button, a validation I s made if the number is guessed correctly. If not guessed a direction is given to the user to try smaller or bigger number. If guessed a congratulation message is displayed.

3. Create Windows Form Application “String Manipulation” with the following possibilities:

  • Validate the string if entered value contains: capital letters, non-capital letters, dot (.), comma (,), question mark (?), exclamation mark (!). 
  • Validate entered robot name. The name must contain: capital letter, digit, capital letter, digit – D2R2. 
  • Validation if entered word is palindrome: if the word is read in the right or reverse order it is the same — KUUK. 
  • The program must work without buttons. 

Содержание

  • Объединение (concatenation) строк
  • Сравнение строк
  • Поиск в строке и перечисление
  • Строковые операции
  • Конструирование строк
  • null и пустые строки
  • Методы манипулирования строками
  • Объединение и разбиение строк
  • Сравнение строк
  • StringBuilder
  • Кодировка
  • Форматирование и разбор (Formatting and Parsing)
    • Методы ToString и Parse
    • Интерфейс IFormattable
    • Форматная строка
    • Поставщики форматов (Format Providers)
    • String.Format и смешанная форматная строка
  • Интернирование строк

Тип string (синоним System.String) представляет беспрерывную последовательность юникод символов. Строковые литералы указываются внутри двойных кавычек.

String — ссылочный тип, однако операторы отношений взаимодействуют со строками как со значимыми типами:

string a = «test», b = «test»;

Console.Write (a == b); // True

Управляющие последовательности, применимые к типу char, могут использоваться и внутри строк:

string a = «Here’s a tab:t»;

Недостаток этого в том, что если нужно использовать символ обратного слэша , его нужно писать дважды (экранировать):

string a1 = «\\server\fileshare\helloworld.cs»;

Чтобы избежать этой проблемы можно использовать дословные (буквальные, verbatim) строковые литералы. Эти литералы начинаются с символа @ и не поддерживают управляющих последовательностей. Они могут занимать несколько строк. Чтобы использовать внутри дословных литералов двойные кавычки их нужно писать дважды.

string a2 = @»\serverfilesharehelloworld.cs»;

Объединение (concatenation) строк

Оператор + объединяет две строки:

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

string s = «a» + 5; // a5

Многократное использование оператора + для построения большой составной строки может быть не эффективным. Для этой цели лучше использовать тип System.Text.StringBuilder, который представляет динамически изменяющуюся строку и включает методы Append, Insert, Remove, и Replace.

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

Строки не поддерживают операторы < и >. Вместо них для сравнения строк нужно использовать строковой метод CompareTo, который возвращает 1 если первая строка предшествует второй, -1  если вторая строка предшествует первой и 0 если строки равны:

Console.Write («Boston».CompareTo («Austin»)); // 1

Console.Write («Boston».CompareTo («Boston»)); // 0

Console.Write («Boston».CompareTo («Chicago»)); // -1

Поиск в строке и перечисление

Строковой индексатор возвращает символ с указанной позицией:

Console.Write («word»[2]); // r

string реализует интерфейс IEnumerable<char>, поэтому по символам строки можно проходить с помощью foreach:

foreach (char c in «123») Console.Write (c + «,»); // 1,2,3,

Простейшими методами для выполнения поиска в строке являются ContainsStartsWith, и EndsWith, все они возвращают true или false:

Console.WriteLine («quick brown fox».Contains («brown»)); // True

Console.WriteLine («quick brown fox».EndsWith («fox»)); // True

Метод IndexOf возвращает позицию первого вхождения заданного символа или подстроки (или -1 если символ или подстрока не найдены):

Console.WriteLine («abcde».IndexOf(«cd»)); // 2

Методы StartsWith, EndsWith и IndexOf перегружены и могут принимать enum StringComparison или объект CultureInfo, чтобы управлять чувствительность к регистру и культуре:

«abcdef».StartsWith(«abc», StringComparison.InvariantCultureIgnoreCase)

Метод IndexOf также может принимать startPosition — индекс, с которого должен начинаться поиск.

Метод LastIndexOf похож на IndexOf, но ищет начиная с конца строки.

Метод IndexOfAny возвращает позицию первого вхождения любого символа из набора, а метод LastIndexOfAny делает тоже самое в обратном направлении:

Console.Write («ab,cd ef».IndexOfAny (new char[] {‘ ‘, ‘,’} )); // 2

Console.Write («pas5w0rd».IndexOfAny («0123456789».ToCharArray() )); // 3

Строковые операции

Поскольку строка является неизменной, все ее методы возвращают новое значения, оставляя исходную строку нетронутой. Помимо указанных выше строка имеет следующие методы:

  • Substring — извлекает часть строки
  • Insert и Remove — вставляют и удаляют символы в указанную позицию
  • PadLeft и PadRight — добавляют пробелы в начали и конце строки
  • TrimStart, TrimEnd, и Trim удаляют пробелы
  • ToUpper и ToLower — преобразуют строку в верхний или нижний регистр
  • Split — разбивает строку на подстроки по переданному разделителю
  • Join — объединяет подстроки в строку

Конструирование строк

Простейший способ создать строку — это присвоение литерала:

Чтобы создать строку из повторяющейся последовательности символов можно использовать конструктор string:

Console.Write (new string (‘*’, 10)); // **********

Строку можно сконструировать из массива char. Метод ToCharArray делает обратное:

char[] ca = «Hello».ToCharArray();

string s = new string (ca); // s = «Hello»

null и пустые строки

Чтобы создать пустую строку можно использовать литерал, либо статическое поле string.Empty. Пустая строка имеет нулевую длину и ее свойство Length равно нулю:

string empty = «»;

Console.WriteLine (empty == «»); // True

Console.WriteLine (empty == string.Empty); // True

Console.WriteLine (empty.Length == 0); // True

Поскольку строки являются ссылочными типами они могут принимать значение null:

string nullString = null;

Console.WriteLine (nullString == null); // True

Console.WriteLine (nullString == «»); // False

Console.WriteLine (nullString.Length == 0); // NullReferenceException

Статический метод string.IsNullOrEmpty позволяет проверить является ли строка null или пустой.

Методы манипулирования строками

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

Метод Substring извлекает часть строки:

string left3 = «12345».Substring (0, 3); // left3 = «123»;

string mid3 = «12345».Substring (1, 3); // mid3 = «234»;

string end3 = «12345».Substring (2); // end3 = «345»;

Методы Insert и Remove вставляют либо удаляют символы в указанной позиции:

string s1 = «helloworld».Insert (5, «, «); // s1 = «hello, world»

string s2 = s1.Remove (5, 2); // s2 = «helloworld»;

Методы PadLeft и PadRight дополняют строку до заданной длины слева или справа указанным символом или пробелом если символ не указан. Если входная строка длиннее заданной длины для дополнения, исходная строка возвращается неизмененной:

Console.WriteLine («12345».PadLeft (9, ‘*’)); // ****12345

Console.WriteLine («12345».PadLeft (9));      //     12345

Методы TrimStart и TrimEnd удаляют указанные символы с начала или конца строки, а метод Trim с двух сторон. Если символ для удаления не указан, удаляется пробельные символы:

Console.WriteLine (» abc trn «.Trim().Length); // 3

Метод Replace заменяет все непересекающиеся вхождения заданного символа или подстроки на другой символ или строку:

Console.WriteLine («to be done».Replace (» «, » | «) ); // to | be | done

Console.WriteLine («to be done».Replace (» «, «») ); // tobedone

Методы ToUpper и ToLower возвращают версию входной строки в верхнем или нижнем регистре с учетом языковых настроек пользователя, а методы ToUpperInvariant и ToLowerInvariant без их учета.

Объединение и разбиение строк

Метод Split принимает предложение и возвращает массив слов. По умолчанию в качестве разделителей метод использует пробельные символы. Перегруженная версия может принимать массив разделителей char или string. Также метод может принимать enum StringSplitOptions, который имеет опцию для удаления пустых элементов.

string[] words = «The quick brown fox».Split();

foreach (string word in words)

Console.Write (word + «|»); // The|quick|brown|fox|

Статический метод Join выполняет действие противоположное методу Split. Он требует указания разделителя и строкового массива.

string[] words = «The quick brown fox».Split();

string together = string.Join (» «, words); // The quick brown fox

Статический метод Concat похож на Join, но принимает только строковой массив без разделителя. Он полностью эквивалентен операции +:

string sentence = string.Concat («The», » quick», » brown», » fox»);

string sameSentence = «The» + » quick» + » brown» + » fox»;

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

При сравнении строк применяются два базовых алгоритма:

  • ординальное сравнение — символы интерпретируются как числа согласно их числовым кодам в Unicode
  • сравнение чувствительно к культуре — символы интерпретируются со ссылкой на конкретный язык. Существует две специальные культуры: текущая культура — культура заданная в настройках конкретной машины; инвариантная культура — одинакова для всех компьютеров (американская культура)

Для сравнения эквивалентности строк можно использовать оператор == или один из методов Equals типа string. Последний существует в двух вариантах: статический и экземплярный. Статически метод полезен тем, что он работает, когда одна или обе строки равны null:

public bool Equals (string value, StringComparison comparisonType);

public static bool Equals (string a, string b, StringComparison comparisonType);

Оператор == и метод string.Equals вызванный без параметров всегда выполняют ординальное сравнение, чувствительное к регистру. Метод string.Equals вызванный с дополнительным параметром StringComparison comparisonType может выполнять сравнение с учетом культуры и нечувствиетльное к регистру. StringComparison определен следующим образом:

public enum StringComparison

{

  CurrentCulture, // Чувствительное к регистру

  CurrentCultureIgnoreCase,

  InvariantCulture, // Чувствительное к регистру

  InvariantCultureIgnoreCase,

  Ordinal,

  OrdinalIgnoreCase

}

Пример:

Console.WriteLine (string.Equals («foo», «FOO»,

                 StringComparison.OrdinalIgnoreCase)); // True

Console.WriteLine («ṻ» == «ǖ»); // False

Console.WriteLine (string.Equals («ṻ», «ǖ»,

                 StringComparison.CurrentCulture)); // Зависит от настроек локали

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

Метод CompareTo выполняет чувствительное к культуре и регистру сравнение. Методы Compare и CompareOrdinal в зависимости от переданных аргументов могут выполнять разные виды сравнения:

public int CompareTo (string strB);

public static int Compare (string strA, string strB, StringComparison comparisonType);

public static int Compare (string strA, string strB, bool ignoreCase, CultureInfo culture);

public static int Compare (string strA, string strB, bool ignoreCase);

public static int CompareOrdinal (string strA, string strB);

Примеры:

Console.WriteLine («Boston».CompareTo («Austin»)); // 1

Console.WriteLine («Boston».CompareTo («Boston»)); // 0

Console.WriteLine («Boston».CompareTo («Chicago»)); // −1

Console.WriteLine («ṻ».CompareTo («ǖ»)); // 0

Console.WriteLine («foo».CompareTo («FOO»)); // −1

Console.WriteLine (string.Compare («foo», «FOO», true)); // 0

// CultureInfo is defined in the System.Globalization namespace

CultureInfo german = CultureInfo.GetCultureInfo («de-DE»);

int i = string.Compare («Müller», «Muller», false, german);

StringBuilder

Класс System.Text.StringBuilder представляет изменяемую (редактируемую) строку. С его помощью можно добавлять (метод Append), вставлять (Insert), удалять (Remove) и заменять (Replace) подстроки, не заменяя целиком StringBuilder. Конструктор StringBuilder дополнительно может принимать начальное значение строки, а также стартовую длину строки (по умолчанию 16 символов). Использование класса StringBuilder для построения строк более эффективно, чем выполнение множества конкатенаций строк.

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 50; i++) sb.Append (i + «,»);

Console.WriteLine (sb.ToString());

// Результат:

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,

27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,

Метод AppendLine добавляет подстроку и завершает ее символами новой строки (rn). Метод AppendFormat принимает смешанную форматную строку точно как String.Format. Класс StringBuilder также содержит свойство Length и индексатор для получения и  установки отдельных символов.

Для очистки содержимого StringBuilder нужно либо создать новый экземпляр, либо установить его свойство Length равным 0 (последний вариант не уменьшит объем занимаемой памяти).

Кодировка

Стандартной кодировкой .NET для символов и строк является UTF-16, а для потокового ввода-вывода — UTF-8.

Класс System.Text.Encoding является базовым классом для типов, инкапсулирующих кодировки текста. Создать экземпляр Encoding можно с помощью статического метода Encoding.GetEncoding, передав ему стандартное имя IANA:

Encoding utf8 = Encoding.GetEncoding («utf-8»);

Encoding chinese = Encoding.GetEncoding («GB18030»);

Экземпляры наиболее распространенных кодировок также могут быть получены через статические свойства Encoding:

Encoding.UTF8

Encoding.Unicode // utf-16

Encoding.UTF32

Encoding.ASCII

Статический метод GetEncodings возвращает список всех поддерживаемых кодировок:

foreach (EncodingInfo info in Encoding.GetEncodings())

  Console.WriteLine (info.Name);

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

Форматирование и разбор (Formatting and Parsing)

Форматирование — преобразование в строку, разбор (парсинг) — преобразование из строки.

Методы ToString и Parse

Методы ToString и Parse являются стандартным механизмом для форматирования и разбора строк. ToString обеспечивает осмысленный вывод для всех простых значимых типов (bool, DateTime, DateTimeOffset, TimeSpan, Guid и всех числовых типов). Для обратной операции в каждом из указанных типов определен статический метод Parse:

string s = true.ToString(); // s = «True»

bool b = bool.Parse (s); // b = true

Метод Parse генерирует исключение FormatException в случае неудачной попытки разбора. Многие типы также определяют метод TryParse, который в случае неудачной попытки разбора возвращает false вместо генерации исключения.

Методы ToString, Parse и TryParse для числовых типов и классов DateTime и DateTimeOffset учитывают местные настройки культуры. Также им можно передать объект CultureInfo, содержащий иные настройки культуры, которые будут использованы вместо местных:

Console.WriteLine (double.Parse («1.234»)); // В России даст 1234

double x = double.Parse («1.234», CultureInfo.InvariantCulture); // 1,234

string x = 1.234.ToString (CultureInfo.InvariantCulture);

Интерфейс IFormattable

Метод ToString числовых типов и типов DateTime/DateTimeOffset реализует интерфейс IFormattable — стандартный интерфейс для поддержки форматных строк и поставщиков форматов:

public interface IFormattable

{

  string ToString (string format, IFormatProvider formatProvider);

}

В связи с этим метод ToString указанных типов может принимать в качестве дополнительных аргументов форматную строку и/или поставщиков форматов. Форматная строка предоставляет инструкции, поставщик формата определяет, как эти инструкции должны применяться:

NumberFormatInfo f = new NumberFormatInfo();

f.CurrencySymbol = «$»;

Console.WriteLine (3.ToString («C», f)); // $ 3.00

В примере "C" — форматная строка, которая означает денежное значение (currency), а объект NumberFormatInfo — поставщик формата, определяющий, как должно визуализироваться денежное значение.

Если для форматной строки и поставщика указать null, будут использованы стандартные варианты. Стандартный поставщик формата — CultureInfo.CurrentCulture, который отражает настройки панели управления компьютера во время выполнения:

Console.WriteLine (10.3.ToString («C», null)); // $10.30

Для удобства большинство типов перегружаю метод ToString, чтобы null для поставщика можно было не указывать:

Console.WriteLine (10.3.ToString («C»)); // $10.30

Console.WriteLine (10.3.ToString («F4»)); // 10.3000

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

Форматная строка

Существует два вида форматных строк:

  • стандартные форматные строки — обеспечивают общее управление форматированием при преобразовании числа или даты/времени в строку; состоят из одной буквы, за которой может следовать цифра
  • специальные форматные строки — позволяют контролировать при форматировании каждый символ с помощью шаблона, сотоящего из произвольного количества предопределенных символов

Подробно форматные строки для чисел и даты/времени рассматриваются в разделах, посвященных этим типам.

Поставщики форматов (Format Providers)

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

  • NumberFormatInfo
  • DateTimeFormatInfo
  • CultureInfo

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

В контексте поставщиков формата CultureInfo представляет собой механизм косвенного обращения к двум другим поставщикам формата — NumberFormatInfo или DateTimeFormatInfo. Он возвращает NumberFormatInfo или DateTimeFormatInfo применимый к региональным настройкам культуры:

CultureInfo uk = CultureInfo.GetCultureInfo («en-GB»);

Console.WriteLine (3.ToString («C», uk)); // £3.00

В следующем примере показано как можно использовать поставщик формата NumberFormatInfo. В примере создается экземпляр поставщика и изменяется разделитель групп с запятой на пробел:

NumberFormatInfo f = new NumberFormatInfo ();

f.NumberGroupSeparator = » «;

Console.WriteLine (12345.6789.ToString («N3», f)); // 12 345.679

Начальные настройки поставщиков NumberFormatInfo и DateTimeFormatInfo основаны на инвариантной культуре.

Все поставщики форматов реализуют интерфейс IFormatProvider:

public interface IFormatProvider

{

  object GetFormat (Type formatType);

}

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

string Format (string format, object arg, IFormatProvider formatProvider);

String.Format и смешанная форматная строка

Статический метод Format предоставляет удобный способ построения строк путем внедрения в нее значений переменных. Внедряемые переменные могут быть любого типа, метод Format просто вызывает на них ToString. Первым аргументом методу передается смешанная форматная строка (строка в которую внедряются переменные), а за ней по очереди все внедряемые переменные:

string composite = «It’s {0} degrees in {1} on this {2} morning»;

string s = string.Format (composite, 35, «Perth», DateTime.Now.DayOfWeek);

// s == «It’s 35 degrees in Perth on this Friday morning»

Числа в фигурных скобках называются форматными переменными. Число соответствует позиции аргумента, а за ним может дополнительно следовать запятая и минимальная ширина и/или двоеточие и форматная строка. Минимальная ширина предназначена для выравнивания колонок (отрицательные значения выравнивают влево, положительные — вправо):

string composite = «Name={0,-20} Credit Limit={1,15:C}»;

Console.WriteLine (string.Format (composite, «Mary», 500));

Console.WriteLine (string.Format (composite, «Elizabeth», 20000));

// Результат:

Name=Mary           Credit Limit=        $500.00

Name=Elizabeth      Credit Limit=     $20,000.00

Смешанную форматную строку также можно добавлять к StringBuilder (через метод AppendFormat) и к TextWriter для ввода-вывода.

Метод string.Format может также принимать необязательный поставщик формата:

string s = string.Format (CultureInfo.InvariantCulture, «{0}», someObject);

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

Интернирование строк — это механизм, при котором одинаковые литералы представляют собой один объект в памяти.  В рамках процесса существует одна внутренняя хеш-таблица, ключами которой являются строки, а значениями — ссылки на них. Во время компиляции литеральные строки последовательно заносятся в эту таблицу. Каждая строка в таблице встречается только один раз. На этапе выполнения ссылки на литеральные строки присваиваются из этой таблицы. Можно поместить строку во внутреннюю таблицу во время выполнения с помощью метода String.Intern. Также можно проверить, содержится ли строка во внутренней таблице с помощью метода String.IsInterned.

Например, следующий код вернет true, т.к. оба параметра ссылаются на один объект из внутренней хэш-таблицы:

string str = literal string;

return object.ReferenceEquals(str, literalstring);

Строки, формирующиеся динамически, во внутреннюю хэш-таблицу не заносятся. Чтобы механизм интернирования заработал для них, их нужно вручную добавить в хэш-таблицу с помощью метода String.Intern:

string str = literal;

str += string; // Создает новую строку

// без следующей строчки кода, метод вернул бы false

str = string.Intern(str);

return object.ReferenceEquals(str, literalstring);

Интернирование позволяет сэкономить память и ускорить сравнение строк. Однако сам процесс добавления строк в хэш-таблицу может быть весьма ресурсоемким.

Лабораторные работы си шарп. Строковые функции

Приложения для Windows forms

Лабораторная работа 13

Выполнить: Разработать приложение, которое подсчитывает количество букв «а» во введенной строке. Для решения использовать функцию пользователя.

Пример выполнения:

Строковые функции VB

Рис. Форма «Строковые функции»

[Название проекта: Lesson_13Lab1, название файла L13Lab1.cs]

✍ Выполнение:

  1. Создайте новый проект и расположите элементы управления на новой форме, как показано на рисунке.
  2. Сначала разработаем функцию, которая будет подсчитывать количество символов в строке. Алгоритм будет очень прозрачным: необходимо перебирать каждый символ в строке с первого до последнего и проверять, совпадает ли он с заданным символом.
  3. Назовем функцию NumberSymbols, эта функция будет от двух аргументов — типа string и char, а значение, возвращаемое функцией, будет типа integer:
1
2
3
4
5
6
7
8
9
10
11
private int NumberSymbols(string stroka, char symbol)
        {
            int k = 0;
            for (int i = 0;i< stroka.Length;i++ ){
                if (stroka[i] == symbol)
                {
                    k += 1;
                }
            }
            return k;
        }
  • Теперь необходимо запрограммировать кнопку Подсчитать:
  • 1
    
    txtKolvo.Text=  NumberSymbols(txtString.Text, 'а').ToString();
  • Запустите и отладьте приложение. Сохраните его.
  • Контрольное задание:

    1. Добавьте текстовое окно для ввода символа, для которого необходимо вычислять количество вхождений.
    2. Подсчитать количество вхождений сочетания букв «ма» в заданную строку.

    Вопросы для самоконтроля:

    1. Какое значение возвратит функция Len(“МАма”)?

    * При использовании материалов обязательна ссылка на источник: Майер С.Ф., «Языки программирования (C#) / Programming languages (C#)» — Учебно-методическое пособие : Южный федеральный университет. – Ростов-на-Дону, 2020. – 212 с.

    Понравилась статья? Поделить с друзьями:
  • Рабочий образ windows 10 64 торрент
  • Работают либо наушники либо колонки windows 10
  • Работа со вторым монитором windows 10
  • Рабочий драйвер radeon для windows 10
  • Работают ли программы windows на linux