Sztringek összehasonlítása a C-ben#

Tip

Ez a cikk az Alapismeretek szakasz része azon fejlesztők számára, akik már legalább egy programozási nyelvet ismernek, és c#-t tanulnak. Ha még csak most ismerkedik a programozással, először az Első lépések oktatóanyagokkal kezdje.

Más nyelvről jön? A C# == a sztringeken az értékeket hasonlítja össze, nem a hivatkozásokat, csakúgy, mint a Java equals vagy a JavaScript ===. A fő különbség az, hogy a C# lehetővé teszi az ordinális (bináris) és a kultúratudatos összehasonlítás közötti választást egy StringComparison értéken keresztül.

Összehasonlítja a sztringeket a két kérdés egyikének megválaszolásához: Egyenlő-e ez a két sztring? vagy milyen sorrendben rendezik ezeket a sztringeket? A C# két független tényező szabályozását teszi lehetővé, amikor bármelyik kérdésre választ ad:

  • Kis- és nagybetűk érzékenysége – egyenlőnek kell-e "Hello" tekinteni és "hello" kezelni őket.
  • Összehasonlítás típusasorszám (az egyes karakterek bináris értékének összehasonlítása) vagy kultúratudatos (a kultúra nyelvi szabályainak alkalmazása).

Az StringComparison enumerálás ezeket a tényezőket egyetlen értékben egyesíti, amelyet az összehasonlító módszereknek ad át.

Összehasonlítás egyenlőségre

A String.Equals metódus és a == operátor alapértelmezés szerint egy kis- és nagybetűket megkülönböztető, ordinális összehasonlítást végez. Az ordinális összehasonlítás ellenőrzi az egyes karakterek bináris értékét, így gyors, és minden gépen ugyanazt az eredményt adja. Egyértelművé teheti a szándékát azzal, hogy meghívja azt a túlterhelt változatot, amely egy StringComparison értéket fogad:

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

A kis- és nagybetűk figyelmen kívül hagyásához az ordinális szemantika megőrzése mellett adja át a következőt: StringComparison.OrdinalIgnoreCase

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

Összehasonlítás rendezési sorrend szerint

Az egyenlőség helyett a rendezési sorrend meghatározásához használja a következőt String.Compare: . Negatív számot, nullát vagy pozitív számot ad vissza annak jelzésére, hogy az első karakterlánc a második elé, vele azonos helyre vagy utána kerül-e a rendezési sorrendben:

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 és CompareTo alapértelmezés szerint kultúraérzékeny összehasonlítást használ, míg Equals és == alapértelmezés szerint ordinális összehasonlítást használ. A meglepetések elkerülése érdekében adjon meg egy explicit StringComparison értéket, hogy a kód meghatározza, hogy milyen viselkedést szeretne.

Hasonlítsa össze az állandókat mintaegyezéssel is vagy switch

Ha az összehasonlítandó érték állandó, akkor az is operátort állandó mintával használhatja olvasható alternatívaként a következőhöz ==:

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.

Ha egy sztringet több állandóval szeretne összehasonlítani, használjon egyswitch kifejezést. Minden ág egy konstans mintát ellenőriz, az eldobó minta pedig (_) minden olyan értéket kezel, amelyre nincs egyezés. A következő példa egy irányt jelölő kulcsszót egy haladási utasításhoz rendel:

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.

A switch sztringkonstansokat vizsgáló kifejezés ugyanazt a kis- és nagybetűket megkülönböztető, ordinális összehasonlítást végzi, mint a ==, ezért a "north" nem egyezik a "North" ággal.

Válassza ki a megfelelő összehasonlítást

Az adatok alapján válassza meg az összehasonlítás típusát, ne megszokásból:

  • Azonosítók, fájlútvonalak, protokolltokenek és más gép által meghatározott szövegek esetében használja a Ordinal elemet (vagy a OrdinalIgnoreCase elemet, ha nem kell megkülönböztetni a kis- és nagybetűket). Az ordinális összehasonlítás gyors és konzisztens a kultúrákban.
  • A felhasználók által elolvasott és rendezett szövegekhez, például nevekhez vagy termékcímekhez használjon CurrentCulture úgy, hogy a megrendelés megfeleljen a felhasználó elvárásainak.

A kultúratudatos összehasonlítás olyan nyelvi szabályokat alkalmaz, amelyek kultúránként eltérőek, és meglepő eredményeket hozhatnak. Például egyes kultúrák a "ss" és a "ß" elemet egyenlőnek tekintik, és a karakterláncok sorrendje gépenként eltérhet. A variabilitás miatt tartsa fenn a kultúratudatos összehasonlítást a valódi természetes nyelvű szövegekhez, és használja ugyanazt az összehasonlítási típust, amikor egyszerre rendez és keres egy gyűjteményt.

A kulturális szempontból érzékeny összehasonlítás részletes ismertetését, beleértve a globalizációs szempontokat és a platformok közötti különbségeket is, lásd a .NET-beli sztring-összehasonlítás ajánlott eljárásai című témakörben.

Lásd még