Tekenreeksen vergelijken in C#

Tip

Dit artikel maakt deel uit van de sectie Grondbeginselen voor ontwikkelaars die al ten minste één programmeertaal kennen en C# leren. Als u nieuw bent in programmeren, begint u eerst met de Aan de slag-handleidingen.

Komt u uit een andere taal? C# == in tekenreeksen vergelijkt waarden, niet verwijzingen, net zoals Java equals of JavaScript===. Het belangrijkste verschil is dat u met C# kunt kiezen tussen ordinale (binaire) en cultuurbewuste vergelijking via een StringComparison waarde.

U vergelijkt tekenreeksen om een van de twee vragen te beantwoorden: Zijn deze twee tekenreeksen gelijk? of in welke volgorde sorteren deze tekenreeksen? Met C# kunt u twee onafhankelijke factoren beheren wanneer u een van beide vragen beantwoordt:

  • Hoofdlettergevoeligheid — of "Hello" en "hello" als gelijk worden beschouwd.
  • Vergelijkingstypeordinaal (vergelijk de binaire waarde van elk teken) of cultuurafhankelijk (pas de taalkundige regels van een cultuur toe).

De StringComparison opsomming combineert deze factoren in één waarde die u doorgeeft aan vergelijkingsmethoden.

Vergelijken voor gelijkheid

De String.Equals methode en de == operator voeren standaard een hoofdlettergevoelige ordinale vergelijking uit. Ordinale vergelijking controleert de binaire waarde van elk teken, dus het is snel en geeft hetzelfde resultaat op elke machine. U kunt uw intentie expliciet maken door de overbelasting aan te roepen die een StringComparison waarde accepteert:

string root = @"C:\users";
string root2 = @"C:\Users";

// Equals and == both perform a case-sensitive, ordinal comparison.
Console.WriteLine(root.Equals(root2));
// => False
Console.WriteLine(root == root2);
// => False

// Pass a StringComparison value to state the intent explicitly.
Console.WriteLine(root.Equals(root2, StringComparison.Ordinal));
// => False

Als u hoofdletters wilt negeren terwijl u ordinale semantiek houdt, geeft u het volgende StringComparison.OrdinalIgnoreCasedoor:

string root = @"C:\users";
string root2 = @"C:\Users";

// OrdinalIgnoreCase compares the binary values but ignores case.
bool equalIgnoringCase = string.Equals(root, root2, StringComparison.OrdinalIgnoreCase);
Console.WriteLine(equalIgnoringCase);
// => True

Vergelijken voor sorteervolgorde

Als u de sorteervolgorde wilt bepalen in plaats van gelijkheid, gebruikt u String.Compare. Het retourneert een negatief getal, nul of een positief getal om aan te geven of de eerste tekenreeks vóór, op dezelfde positie als of na de tweede sorteert:

string first = "Avocado";
string second = "Banana";

// Compare returns a negative number, zero, or a positive number
// to indicate sort order. Specify the comparison type explicitly.
int order = string.Compare(first, second, StringComparison.Ordinal);
Console.WriteLine(order < 0
    ? $"'{first}' sorts before '{second}'."
    : $"'{first}' sorts at or after '{second}'.");
// => 'Avocado' sorts before 'Banana'.

Important

Compare en CompareTo gebruiken standaard een cultuurafhankelijke vergelijking, terwijl Equals en == standaard een ordinale vergelijking gebruiken. Als u verrassingen wilt voorkomen, geeft u een expliciete StringComparison waarde door, zodat uw code aangeeft welk gedrag het wil.

Vergelijken met constanten met patroonkoppeling is of switch

Wanneer de waarde waarmee u vergelijkt een constante is, kunt u de is operator met een constant patroon gebruiken als een leesbaar alternatief voor ==:

string status = "Ready";

// When the right operand is a constant, the is operator and a
// constant pattern read as an alternative to ==.
if (status is "Ready")
{
    Console.WriteLine("The system is ready.");
}
// => The system is ready.

Als u een tekenreeks wilt vergelijken met verschillende constanten, gebruikt u een switch expressie. Elke arm test een constant patroon en het verwijderingspatroon (_) verwerkt elke waarde die niet overeenkomt. In het volgende voorbeeld wordt een richtingssleutelwoord aan een reisinstructie gekoppeld:

foreach (string heading in new[] { "North", "South", "East", "West", "NE" })
{
    // A switch expression matches each constant pattern in turn and
    // returns the first match. The discard (_) handles every other value.
    string instruction = heading switch
    {
        "North" => "Travel due North for 10 km.",
        "South" => "Travel due South for 10 km.",
        "East" => "Travel due East for 10 km.",
        "West" => "Travel due West for 10 km.",
        _ => $"Unknown heading: {heading}.",
    };
    Console.WriteLine(instruction);
}
// => Travel due North for 10 km.
// => Travel due South for 10 km.
// => Travel due East for 10 km.
// => Travel due West for 10 km.
// => Unknown heading: NE.

Een switch expressie die tekenreeksconstanten test, voert dezelfde hoofdlettergevoelige, rangtelkundige vergelijking uit als ==, dus "north" komt niet overeen met de "North" arm.

De juiste vergelijking kiezen

Kies het vergelijkingstype op basis van de gegevens, niet uit gewoonte:

  • Gebruik voor id's, bestandspaden, protocoltokens en andere door de machine gedefinieerde tekst Ordinal (of OrdinalIgnoreCase om hoofdletters te negeren). Ordinale vergelijking is snel en consistent in verschillende culturen.
  • Gebruik voor tekst die gebruikers lezen en sorteren, zoals namen of producttitels, CurrentCulture zodat de volgorde overeenkomt met de verwachtingen van de gebruiker.

Cultuurbewuste vergelijking past taalkundige regels toe die per cultuur variëren en kunnen verrassende resultaten opleveren. Bijvoorbeeld, sommige culturen beschouwen "ss" en "ß" als gelijk, en de volgorde van tekenreeksen kan per machine verschillen. Vanwege deze variabiliteit reserveert u cultuurbewuste vergelijking voor echte tekst in natuurlijke taal en gebruikt u dezelfde vergelijkingssoort wanneer u een verzameling sorteert en doorzoekt.

Zie Aanbevolen procedures voor het vergelijken van tekenreeksen in .NET voor een diepgaande bespreking van cultuurgevoelige vergelijking, waaronder aandachtspunten voor globalisering en platformverschillen.

Zie ook