Ce face Contains, StartsWith și EndsWith
Metodele Contains, StartsWith și EndsWith sunt instrumentele standard pentru căutarea rapidă în șiruri de caractere, validarea extensiilor de fișiere, a prefixelor de URL-uri sau filtrarea textelor. Atunci când ai nevoie nu doar de un răspuns bool, ci și de poziția exactă a sub-șirului, metodele IndexOf și LastIndexOf returnează indexul de la zero al apariției (sau -1 dacă sub-șirul nu există).
O bună practică esențială în .NET este specificarea explicită a parametrului StringComparison. Pentru verificări tehnice (căi de fișiere, antete HTTP, adrese de e-mail, chei de configurare, extensii), folosește întotdeauna StringComparison.Ordinal (sensibil la majuscule) sau StringComparison.OrdinalIgnoreCase (insensibil la majuscule): acestea compară direct codurile binare ale caracterelor, fiind mult mai rapide și imune la diferențele culturale ale sistemului de operare.
Parametri, metode și opțiuni
| Parametru / Metodă | Descriere |
|---|---|
text.Contains(string value, StringComparison comp) |
Returnează true dacă value apare oriunde în interiorul șirului text. |
text.StartsWith(string value, StringComparison comp) |
Verifică dacă șirul text începe cu secvența value. |
text.EndsWith(string value, StringComparison comp) |
Verifică dacă șirul text se termină cu secvența value. |
text.IndexOf(string value, StringComparison comp) |
Returnează indexul primei apariții a lui value (începând de la 0), sau -1 dacă nu a fost găsit. |
StringComparison.Ordinal / OrdinalIgnoreCase |
Comparație binară rapidă, independentă de cultura locală (recomandată pentru identificatori, URL-uri, extensii). |
string.IsNullOrWhiteSpace(string? value) |
Metodă statică utilitară care returnează true dacă șirul este null, gol ("") sau format doar din spații albe. |
Exemple
Exemplul 1: Validarea URL-urilor și a extensiilor cu OrdinalIgnoreCase
Verificăm protocolul și extensia unui fișier fără a aloca șiruri noi în memorie prin .ToLower().
string url = "HTTPS://cdn.dexblog.ro/arhiva/Raport_2026.PDF";
bool esteHttps = url.StartsWith("https://", StringComparison.OrdinalIgnoreCase);
bool estePdf = url.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase);
bool esteDinArhiva = url.Contains("/arhiva/", StringComparison.OrdinalIgnoreCase);
Console.WriteLine($"Conexiune securizată: {esteHttps}");
Console.WriteLine($"Document PDF: {estePdf}");
Console.WriteLine($"Din folderul arhivă: {esteDinArhiva}");
Ieșire în consolă
Conexiune securizată: True
Document PDF: True
Din folderul arhivă: True
Exemplul 2: Găsirea poziției unui delimitator cu IndexOf și verificarea șirurilor goale
Folosim string.IsNullOrWhiteSpace pentru validarea inițială și IndexOf pentru a extrage domeniul dintr-o adresă de e-mail.
string email = "contact@dexblog.ro";
if (!string.IsNullOrWhiteSpace(email))
{
int pozitieArond = email.IndexOf('@');
if (pozitieArond > 0 && pozitieArond < email.Length - 1)
{
string utilizator = email[..pozitieArond];
string domeniu = email[(pozitieArond + 1)..];
Console.WriteLine($"Utilizator: {utilizator} | Domeniu: {domeniu}");
}
}
Ieșire în consolă
Utilizator: contact | Domeniu: dexblog.ro
Greșeli frecvente
- Scrierea
text.ToLower().Contains(cautat.ToLower())pentru căutări insensibile la majuscule — această abordare alocă două șiruri noi pe heap la fiecare apel și poate da rezultate greșite pentru anumite caractere Unicode (de exemplu „I” în limba turcă). Folosește întotdeaunatext.Contains(cautat, StringComparison.OrdinalIgnoreCase). - Folosirea
StartsWithsauEndsWithcu un parametrustringfără a specificaStringComparison: implicit, aceste două metode folosescCurrentCulture(comparare lingvistică lentă), spre deosebire deContains(string)care folosește implicitOrdinal.
Funcții și concepte înrudite
Replace, Trim și Substring: Curăță spațiile de la capete, înlocuiește fragmente de text și extrage sub-șiruri prin Substring sau operatorul de interval (..).String.Split / String.Join: Desparte un șir de caractere într-un tablou de sub-șiruri după delimitatori și recompune o colecție într-un singur șir.Enumerable.Where: Filtrează declarativ o secvență de elemente pe baza unui predicat lambda, cu execuție amânată (deferred execution).