Contains, StartsWith și EndsWith în C# (.NET)

Șiruri de caractere (String) .NET 1.0+ (StringComparison în Contains din .NET Core 2.1+)

Verifică dacă un șir conține, începe sau se termină cu un anumit sub-șir și găsește poziția acestuia cu IndexOf.

Sintaxă C#
bool gasit = text.Contains(sub, StringComparison.OrdinalIgnoreCase);

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 întotdeauna text.Contains(cautat, StringComparison.OrdinalIgnoreCase).
  • Folosirea StartsWith sau EndsWith cu un parametru string fără a specifica StringComparison: implicit, aceste două metode folosesc CurrentCulture (comparare lingvistică lentă), spre deosebire de Contains(string) care folosește implicit Ordinal.

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).