C#. Тип string. Приклади. Функції, властивості, операції




Тип string. Приклади. Функції, властивості, операції


Зміст


Пошук на інших ресурсах:

1. Які характерні особливості типу string у мові C#?

У мові C#, вбудований тип даних string підтримує символьні рядки у кодуванні Unicode. Для рядків типу string характерні наступні особливості:

  • будь-яка змінна типу string представляє собою об’єкт класу System.String;
  • тип string відноситься до посилальних типів а не до типів-значень;
  • рядки типу string розміщуються в “купі” (heap);
  • до рядків типу string можна застосовувати різноманітні методи, властивості та операції;
  • рядок типу string можна створювати з використанням оператора new та без використання цього оператора шляхом присвоєння =.
  • вміст об’єкту типу string змінити не можна.

Приклад рядка-літералу типу string:

"This is a text"

 


2. Способи створення екземпляру типу string

Як відомо тип string є псевдонімом до класу System.String. Клас System.String має декілька конструкторів. Нижче наведено приклад програми, в якій продемонстровано створення екземплярів типу string різними способами.

using System;

namespace ConsoleApp1
{
  class Program
  {
    static void Main(string[] args)
    {
      // Способи створення екземпляру типу string
      // 1. Створення та ініціалізація рядка при його оголошенні
      string s1 = "Hello";
      Console.WriteLine("s1 = {0}", s1);

      // 2. Створення рядка з масиву типу char[]
      char[] ArrayChar = { 'H', 'e', 'l', 'l', 'o' };
      string s2 = new string(ArrayChar);
      Console.WriteLine("s2 = {0}", s2);

      string s3 = new string(ArrayChar, 2, 3); // отримати частину рядка
      Console.WriteLine("s3 = {0}", s3);

      // 3. Створення рядка з допомогою перевантаженого оператора присвоєння =
      string s4;
      s4 = "Hello";
      Console.WriteLine("s4 = {0}", s4);

      // 4. Створення рядка з одного символу
      string s5 = new string('+', 10); // символ '+' - 10 разів
      Console.WriteLine("s5 = {0}", s5);

      // 5. Буквальні рядки (verbatim strings)
      string s6;
      s6 = @"C:\Programs\abc.txt"; // це є буквальний рядок, перед рядком стоїть @
      Console.WriteLine("s6 = {0}", s6);          
      Console.ReadKey();
    }
  }
}

Результат виконання програми

s1 = Hello
s2 = Hello
s3 = llo
s4 = Hello
s5 = ++++++++++
s6 = C:\Programs\abc.txt

  


3. Як у змінну типу string занести значення рядка? Операція =

Для цього потрібно використати оператор присвоєння ‘=’.

Варіант 1. Присвоєння після опису.

string s; // опис змінної
s = "This is a text"; // присвоєння значення тексту

Варіант 2. Присвоєння під час опису (початкова ініціалізація).

string s = "This is a text"; // початкова ініціалізація

Варіант 3. Використання методу Copy().

s = string.Copy("This is a text"); // s = "This is a text"

 


4. Як визначити чи рівні два рядки типу string між собою? Операція ==

Два рядки можна порівнювати звичайним оператором порівняння “==“.

Фрагмент коду, що визначає рівність (нерівність) двох рядків:

string s1 = "Hello!";
string s2 = "Hello!";
bool f_equal;

if (s1 == s2)
    f_equal = true;
else
    f_equal = false;

 


5. Як порівняти два рядки типу string в лексикографічному порядку? Метод CompareTo()

У цьому випадку можна використати метод CompareTo(). Метод повертає -1, 0 або 1. У наведеному прикладі видно результат роботи методу.

string s1 = "abcd";
string s2 = "abcde";
int res;

res = s1.CompareTo(s2); // res = -1, (s1<s2)
res = s2.CompareTo(s1); // res = 1, (s2>s1)

s2 = s1; // рядки рівні
res = s1.CompareTo(s2); // res = 0, (s1==s2)
res = s2.CompareTo(s1); // res = 0


 


6. Як об’єднати два рядки типу string? Метод Concat(), операція +

Спосіб №1 – функція Concat().

string s1 = "Hello ";
string s2 = "world!";
string s3;
s3 = string.Concat(s1, s2); // s3 = "Hello world!"

Спосіб № 2 – використання оператора “+“.

string s1 = "Hello ";
string s2 = "world!";
string s3;
s3 = s1 + s2; // s3 = "Hello world!"

 


7. Як скопіювати один рядок типу string в інший? Метод Copy(), операція присвоювання =

Спосіб № 1 – оператор присвоєння.

string s1 = "My string";
string s2;
s2 = s1; // s2 = "My string"

Спосіб № 2 – метод Copy().

string s1 = "My string";
string s2;
s2 = string.Copy(s1); // s2 = "My string"

 


8. Вставка підрядка починаючи з заданого індексу. Метод Insert()

Для вставки підрядка використовується функція Insert(). Функція приймає два параметри. Перший параметр – позиція індексу в рядку, з якої робиться вставка (починається з 0). Другий параметр – текст самого рядка.

string s1 = "ABEF";
string s2;
s2 = s1.Insert(2, "CD"); // s2 = "ABCDEF"
s1 = "123";
s2 = s1.Insert(0, "555"); // s2 = "555123"

// Помилка!
// Заданий аргумент знаходиться за межами допустимих значень.
// s2 = s1.Insert(20, "33");

Якщо задати невірний індекс за межами діапазону, то згенерується виключна ситуація.

 


9. Пошук і повернення індексу першого входження підрядка в даний рядок. Метод IndexOf()

Реалізується функцією IndexOf(). Якщо знайдено підрядок у рядку, то функція повертає позицію першого входження. В іншому випадку функція повертає -1.

Функція має перевантажені варіанти реалізації.

string s = "Hello world!";
int index;
index = s.IndexOf("wor"); // index = 6
index = s.IndexOf("abc"); // index = -1 - не знайшло підрядок "ab" в рядку "Hello world"

// інший варіант функції IndexOf()
index = s.IndexOf("wor", 7); // index = -1 - пошук з позиції 7
index = s.IndexOf("wor", 0); // index = 6 - пошук з позиції 0

// пошук йде від заданого індексу (3)
// і перевіряється задана кількість символів (5)
index = s.IndexOf("wo", 3, 5); // index = 6

 


10. Пошук і повернення індексу останнього входження підрядка в даний рядок функцією LastIndexOf().

Функція має декілька перевантажених реалізацій. Нумерація індексу останнього входження починається з 0.

string s = "bestprog.net";
int index;
index = s.LastIndexOf("prog"); // index = 4

 


11. Як визначити довжину рядка типу string? Властивість Length

Для визначення довжини рядка (кількість символів) типу string використовується властивість Length.

string s = "bestprog.net";
int len;
len = s.Length; // len = 12
s = ""; // len = 0

 


12. Створення рядка заданої ширини. Методи PadLeft() та PadRight()

Функції PadLeft() та PadRight() використовується для створення форматованого рядка, в якому позиції справа або зліва заповнюються пробілами.

string s1 = "abc";
string s2;
s2 = s1.PadLeft(5); // s2 = " abc"
s2 = s1.PadLeft(2); // s2 = "abc"
s2 = s1.PadLeft(9); // s2 = "     abc"

// помилка "Non-negative number required."
// "Потрібно невід'ємне число
// s2 = s1.PadLeft(-2);

s2 = s1.PadRight(2); // s2 = "abc"
s2 = s1.PadRight(8); // s2 = "abc     "

 


13. Видалення заданої кількості символів з рядка. Метод Remove()

Метод Remove() має дві реалізації. У першій реалізації метод має два параметри. У другій – один параметр.

Приклад 1. Реалізація методу Remove() з двома параметрами.

string s1 = "0123456789";
string s2;
s2 = s1.Remove(3, 2); // s2 = "01256789"

У даному прикладі функція Remove() отримує два параметри. Перший параметр – позиція, з якої робиться видалення. Другий параметр – кількість видалених символів.

Приклад 2. Реалізація з одним параметром.

string s1 = "0123456789";
string s2;
s2 = s1.Remove(4); // s2 = "0123"

У цьому прикладі функція отримує один параметр. Цей параметр визначає позицію з якої буде здійснено видалення символів.

Якщо вказати

s2 = s1.Remove(0);

то буде видалено увесь рядок.

Приклад 3. Якщо потрібно видалити останній символ у рядку, то потрібно написати такий код.

string s1 = "This is a text!";
string s2;
int len;
len = s1.Length;
s2 = s1.Remove(len-1); // s2 = "This is a text"

 


14. Заміна символів у рядку. Метод Replace()

Функція Replace() має два варіанти реалізації. Перший варіант оперує рядками типу string. Другий варіант оперує типом char.

Приклад 1. Використання функції Replace() для заміни одного рядка на інший.

string s1 = "0123456789";
string s2;
s2 = s1.Replace("012", "ABC"); // s2 = "ABC3456789"

Приклад 2. Використання функції Replace() для заміни символу.

string s1 = "0123456789";
string s2;
s2 = s1.Replace('0', 'A'); // s2 = "A123456789"

 


15. Як у рядку виділити підрядок. Метод Substring()

Метод Substring() має дві реалізації.

Варіант 1. Виділення підрядка з заданої позиції до кінця рядка.

string s1 = "Automobile";
string s2;
s2 = s1.Substring(4); // s2 = "mobile

Варіант 2. Виділення підрядка з заданої позиції (параметр 1) у заданій кількості символів (параметр 2).

string s1 = "Automobile";
string s2;
s2 = s1.Substring(0, 4); // s2 = "Auto"

 


16. Перетворення числового рядка типу string в ціле число. Метод Parse().

Функція Parse() дозволяє переводити рядок, що складається з цифр, у ціле число. Така функція корисна коли потрібно отримати число, яке було введене з клавіатури і отримане у вигляді рядка. Наприклад, ввід з елементу управління типу TextBox.

// string => int
string s = "389";
int i;
i = int.Parse(s);
i = int.Parse("-29"); // i = -29

 


17. Перетворення цілого числа в рядок. Метод ToString().

Функція ToString() переводить ціле число в його представлення у вигляді рядка. Наприклад, така функція корисна, коли потрібно вивести ціле число на форму в елементі управління Label.

// int => string
string s;
int i;
i = 230;
s = i.ToString(); // s = "230"

 


18. Перетворення рядка string в число з плаваючою комою.

При перетворенні рядка в дійсне число важливо враховувати кодування символів.

Якщо у вас встановлено операційну систему з кириличним кодуванням і налаштовані відповідні регіональні стандарти, тоді символ ‘.’ має бути замінений на символ ‘ , ‘. Це пов’язано з тим, що в країнах які використовують кирилицю розділювачем між цілою і дробовою частинами є символ ‘ , ‘ (кома). А в англомовних країнах розділювачем цілої і дробової частин є символ ‘.’ (крапка).

Символ-розділювач цілої та дробової частини можна змінити в регіональних налаштуваннях Windows.

Тому, в ОС Windows з кириличним кодуванням за замовчуванням, наступний код викличе виключну ситуацію FormatException з повідомленням: “Input string was not in a correct format” (Вихідний рядок має невірний формат).

double x;
string s;
s = "9.83";
// генерується виключна ситуація FormatException
// з повідомленням "Input string was not in a correct format."
x = double.Parse(s);

Нижче наведено правильний варіант для ОС з кириличним кодуванням:

// string => double
double x;
string s;
s = "9,83";
x = double.Parse(s);

 


19. Перетворення числа з плаваючою комою в string.
// double => string
double x;
string s;
x = -39.038;
s = x.ToString(); // s = "-39,038"

 


20.Переведення значення змінної логічного типу bool в рядок string.
// string => bool
bool b;
string s;
s = "true";
b = bool.Parse(s); // b = True

Якщо ввести неправильне значення в рядок s, то генерується виключна ситуація з повідомленням:

"String was not recognized as a valid Boolean"

 


21. Сталість рядків. Як у рядку типу string замінити символ в заданій позиції: s[index] = c

У мові C# тип string має одну особливість. Доступ до окремого символу рядка здійснюється тільки в режимі читання. Безпосередньо змінити значення символу в рядку типу string не вдасться. Це означає, що рядки є сталими (константними, постійними).

Наступний фрагмент коду

string s = "Hello world!";
s[6] = 'W'; // помилка!!! - символ можна тільки прочитати

char c;
c = s[6]; // c = 'w' - так добре

у рядку

s[6] = 'W';

викличе помилку компілятора

Property or indexer 'string.this[int]' cannot be assigned to -- it is read only

Отже, значення символу в заданій позиції в рядку типу string можна тільки читати.

Щоб вирішити цю проблему можна використати (як приклад) один з запропонованих способів.

Спосіб 1. Використання методів Substring() та String(). При використанні цього способу потрібно виконувати перевірку значення індексу на коректність. Якщо значення індексу виходить за межі розмірності рядка, то виникне виключна ситуація.

// Як у рядку замінити символ в заданій позиції: s[index]=c
// Спосіб 1. Використання методів Substring(), ToString().
// Вхідні дані:
string s = "Hello world!"; // вихідний рядок
int index = 0; // індекс в рядку, де потрібно зробити заміну (нумерується з 0)
char c = '+'; // символ заміни

// Перевірка значення index на коректність
if ((index >= 0) && (index < s.Length))
  s = s.Substring(0, index) + c.ToString() + s.Substring(index + 1);

Спосіб 2. Використання оператора циклу.

// Спосіб 2. Використання деякого циклу та додаткового рядка.
// Якщо значення index некоректне, то вихідний рядок не змінюється
// Вхідні дані:
string s = "Hello world!"; // вихідний рядок
int index = 5; // індекс заміни (нумерується з 0)
char c = '+'; // символ заміни

string s2 = ""; // додатковий рядок
for (int i = 0; i < s.Length; i++)
  if (i != index) s2 += s[i];
    else s2 += c;
  s = s2;

Спосіб 3. Використання методів Remove() та Insert(). У цьому випадку також потрібно перевіряти індекс заміни на коректність.

// Як у рядку замінити символ в заданій позиції: s[index]=c
// Спосіб 3. Методи Insert(), Remove()
// Вхідні дані:
string s = "Hello world!"; // вихідний рядок
int index = 5; // індекс в рядку, де потрібно зробити заміну (нумерується з 0)
char c = '+'; // символ заміни

// Тут потрібно робити перевірку на коректність значення pos,
// якщо index некоректне, то виникне виключна ситуація
if ((index >= 0) && (index < s.Length))
{
  s = s.Remove(index, 1);
  s = s.Insert(index, c.ToString());
}