Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tip
Tento článek je součástí části Základy pro vývojáře, kteří už znají aspoň jeden programovací jazyk a učí se jazyk C#. Pokud s programováním teprve začínáte, začněte nejprve kurzy Začínáme .
Pochází z jiného jazyka? C# == u řetězců porovnává hodnoty, nikoli odkazy, podobně jako Java equals nebo JavaScript ===. Klíčovým rozdílem je, že jazyk C# umožňuje vybrat si mezi ordinálním (binárním) a porovnáním závislým na jazykové verzi pomocí hodnoty StringComparison.
Porovnáváte řetězce a odpovídáte na jednu ze dvou otázek: Jsou tyto dva řetězce stejné? nebo v jakém pořadí se tyto řetězce seřadí? Jazyk C# umožňuje řídit dva nezávislé faktory, když odpovíte na jednu z otázek:
-
Citlivost na malá a velká písmena – zda
"Hello"a"hello"jsou považovány za stejné. - Druh porovnání — ordinální (porovná binární hodnotu každého znaku) nebo s ohledem na jazyk a národní prostředí (použijí se jazyková pravidla dané jazykové verze).
Výčet StringComparison kombinuje tyto faktory do jedné hodnoty, kterou předáte metodám porovnání.
Porovnat na rovnost
Metoda String.Equals a operátor == ve výchozím nastavení provádějí porovnání s rozlišováním velkých a malých písmen v ordinálním pořadí. Pořadové porovnání kontroluje binární hodnotu každého znaku, takže je rychlé a dává stejný výsledek na každém počítači. Svůj záměr můžete explicitně vyjádřit voláním přetížení, které má jako parametr hodnotu StringComparison:
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
Chcete-li ignorovat případ při zachování řadové sémantiky, předejte 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
Porovnat pro pořadí řazení
Chcete-li určit pořadí řazení místo rovnosti, použijte String.Compare. Vrátí záporné číslo, nulu nebo kladné číslo, které určuje, zda se první řetězec při řazení nachází před druhým řetězcem, na stejné pozici jako druhý řetězec nebo za ním:
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 a CompareTo ve výchozím nastavení používají porovnávání s ohledem na jazykovou verzi a kulturní zvyklosti, zatímco Equals a == ve výchozím nastavení používají ordinální porovnávání. Abyste se vyhnuli překvapením, předejte explicitní StringComparison hodnotu, aby váš kód uvádí, jaké chování chce.
Porovnávejte s konstantami pomocí porovnávání vzorů is nebo switch
Když je hodnota, se kterou porovnáváte, konstanta, můžete operátor is s konstantním vzorem použít jako čitelnou alternativu k ==:
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.
Pokud chcete porovnat řetězec s několika konstantami, použijte switch výraz. Každá arm testuje konstantní vzor a vzor zahození (_) zpracovává každou hodnotu, která se neshoduje. Další příklad přiřazuje směrové klíčové slovo k pokynu k pohybu:
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.
Výraz switch , který testuje řetězcové konstanty, provádí stejné porovnání s rozlišováním velkých a malých písmen jako ==, takže "north" neodpovídá rameni "North" .
Výběr správného porovnání
Vyberte typ porovnání na základě dat, nikoli ze zvyku:
- Pro identifikátory, cesty k souborům, tokeny protokolu a další strojově definovaný text použijte Ordinal (nebo OrdinalIgnoreCase pro nerozlišování velkých a malých písmen). Ordinální porovnání je rychlé a konzistentní napříč kulturami.
- Pro text, který uživatelé čtou a řadí, například jména nebo názvy produktů, použijte CurrentCulture, aby pořadí odpovídalo očekávání uživatele.
Porovnávání s ohledem na národní prostředí používá jazyková pravidla, která se v různých kulturách liší, a může vést k překvapivým výsledkům. Například v některých kulturách jsou "ss" a "ß" považovány za stejné a pořadí řetězců se může na různých počítačích lišit. Vzhledem k této variabilitě vyhraďte porovnávání zohledňující jazykové a kulturní rozdíly pro skutečný text v přirozeném jazyce a při řazení kolekce i vyhledávání v ní vždy používejte stejný typ porovnávání.
Podrobnější pojednání o porovnávání s ohledem na jazykové zvyklosti, včetně hledisek globalizace a rozdílů mezi platformami, najdete v tématu Osvědčené postupy pro porovnávání řetězců v .NET.