Șiruri și clasa String
Un număr destul de mare de sarcini, care pot apărea în dezvoltarea aplicațiilor, sunt într-un fel sau altul legate de procesarea șirurilor de caractere - parsarea paginilor web, căutarea în text, unele sarcini analitice legate de extragerea informațiilor necesare din text, etc. De aceea, în acest sens, lucrul cu șirurile de caractere primește o atenție deosebită.
În limbajul C# valorile de tip șir sunt reprezentate de tipul string, iar toată funcționalitatea lucrului cu acest tip este concentrată în clasa System.String. De fapt, string este un pseudonim pentru clasa String.
Obiectele acestei clase reprezintă textul ca o secvență de caractere Unicode. Dimensiunea maximă a unui obiect String poate fi de 2 GB în memorie, sau aproximativ 1 miliard de caractere.
Crearea șirurilor
Șirurile pot fi create atât folosind o variabilă de tip string și atribuindu-i o valoare, cât și utilizând unul dintre constructorii clasei String:
string s1 = "hello";
string s2 = new String('a', 6); // rezultatul va fi șirul "aaaaaa"
string s3 = new String(new char[] { 'w', 'o', 'r', 'l', 'd' });
string s4 = new String(new char[] { 'w', 'o', 'r', 'l', 'd' }, 1, 3); // orl
Console.WriteLine(s1); // hello
Console.WriteLine(s2); // aaaaaa
Console.WriteLine(s3); // world
Console.WriteLine(s4); // orl
Constructorul String are diverse versiuni. Astfel, apelul constructorului:
new String('a', 6)
Repetă de 6 ori obiectul din primul parametru, adică de fapt creează șirul "aaaaaa".
Un alt constructor primește un tablou de caractere, din care se creează șirul:
string s3 = new String(new char[] { 'w', 'o', 'r', 'l', 'd' });
Al treilea constructor utilizat mai sus în exemplu permite crearea unui șir dintr-o parte a tabloului de caractere. Al doilea parametru transmite indicele de început, de la care se extrag caracterele, iar al treilea parametru indică numărul de caractere:
string s4 = new String(new char[] { 'w', 'o', 'r', 'l', 'd' }, 1, 3); // orl
Șirul ca set de caractere
Deoarece șirul stochează o colecție de caractere, în el este definit un indexator pentru accesarea acestor caractere:
public char this[int index] {get;}
Aplicând indexatorul, putem accesa șirul ca un tablou de caractere și obține orice caracter al său prin index:
string message = "hello";
// obținem caracterul
char firstChar = message[1]; // caracterul 'e'
Console.WriteLine(firstChar); // e
Console.WriteLine(message.Length); // lungimea șirului
Utilizând proprietatea Length, ca și în cazul unui tablou obișnuit, putem obține lungimea șirului.
Parcurgerea șirurilor
Clasa String implementează interfața IEnumerable, datorită căreia șirul poate fi parcurs în ciclul foreach ca un set de obiecte char. De asemenea, putem parcurge șirul folosind alte tipuri de cicluri, aplicând accesul la caractere prin index:
string message = "hello";
for(var i = 0; i < message.Length; i++)
{
Console.WriteLine(message[i]);
}
foreach(var ch in message)
{
Console.WriteLine(ch);
}
Compararea șirurilor
Spre deosebire de alte clase, șirurile sunt comparate după valoarea caracterelor lor, nu după referințe:
string message1 = "hello";
string message2 = "hello";
Console.WriteLine(message1 == message2); // true
Șiruri multiline
Începând cu C# 11, folosind trei perechi de ghilimele duble, se poate crea un text multiline, inclusiv cu aplicarea interpolării:
Print();
PrintValue("hello");
void Print()
{
string text = """
<element attr="content">
<body>
</body>
</element>
""";
Console.WriteLine(text);
}
void PrintValue(string val)
{
string text = $"""
<element attr="content">
<body>
{val}
</body>
</element>
""";
// sau așa
// string text = $$"""
// <element attr="content">
// <body>
// {{val}}
// </body>
// </element>
// """;
Console.WriteLine(text);
}
Metode principale ale șirurilor
Funcționalitatea principală a clasei String este dezvăluită prin metodele sale, printre care putem evidenția următoarele:
- Compare: compară două șiruri ținând cont de cultura curentă (locale) a utilizatorului
- CompareOrdinal: compară două șiruri fără a ține cont de locale
- Contains: determină dacă o subșir se află în șir
- Concat: unește șiruri
- CopyTo: copiază o parte a șirului, începând de la un anumit index în tablou
- EndsWith: determină dacă sfârșitul șirului coincide cu subșirul
- Format: formatează șirul
- IndexOf: găsește indexul primei apariții a unui caracter sau subșir în șir
- Insert: inserează în șir un subșir
- Join: unește elementele unui tablou de șiruri
- LastIndexOf: găsește indexul ultimei apariții a unui caracter sau subșir în șir
- Replace: înlocuiește în șir un caracter sau subșir cu alt caracter sau subșir
- Split: împarte un șir în tablou de șiruri
- Substring: extrage din șir un subșir, începând de la o poziție specificată
- ToLower: convertește toate caracterele șirului în litere mici
- ToUpper: convertește toate caracterele șirului în litere mari
- Trim: elimină spațiile de la începutul și sfârșitul șirului
În articolele următoare vom analiza funcționarea acestor metode.