Sdílet prostřednictvím


Postupy: Porovnávání řetězců (Průvodce programováním v C#)

Při porovnávání řetězců jsou vyrábějící výsledek, který říká jeden řetězec je větší než nebo menší než druhé, nebo zda jsou dva řetězce stejné.Pravidla, kterými se stanoví výsledek se liší v závislosti na tom, zda provádíte porovnávání podle pořadového čísla nebo srovnání citlivé na jazykovou verzi.Je důležité použít správný typ porovnání pro konkrétní úkol.

Máte-li porovnat nebo řadit hodnoty dvou řetězců bez ohledu na jazykových konvencích, používáte základní ordinální porovnávání.Základní porovnání podle pořadového čísla (System.StringComparison.Ordinal) je velká a malá písmena, což znamená, že dva řetězce musí shodují znak po znaku: "a" není rovno "A" nebo "A".Změna se často používá System.StringComparison.OrdinalIgnoreCase, které budou odpovídat "a", "A" a "A".StringComparison.OrdinalIgnoreCasečasto slouží k porovnání názvů souborů, názvy cest, síťové cesty a jakýkoli jiný řetězec jejíž hodnota se nemění založenou na národním prostředí uživatele počítače.Další informace naleznete v tématu StringComparison.

Porovnání zohledňující jazykovou verzi se obvykle používají k porovnání a řazení řetězců, které jsou vstupní koncovým uživatelem, protože znaky a konvence řazení těchto řetězců může lišit v závislosti na národním prostředí uživatele počítače.Dokonce i řetězce, které obsahují stejné znaky může řadit odlišně v závislosti na jazykové verzi aktuálního vlákna.

[!POZNÁMKA]

Při porovnávání řetězců používejte metody, které explicitně určit, jaký typ porovnání, který chcete provést.Tím daný kód mnohem více udržovatelná a čitelná.Kdykoli je to možné, použijte přetížení metody String a Array , třídy, které přijímají StringComparison výčtu parametru tak, aby bylo možné určit typ porovnání k provedení.Je vhodné se vyhnout použití == a != hospodářské subjekty při porovnávání řetězců.Také nepoužívejte String.CompareTo instance metody, protože žádná přetížení trvá StringComparison.

Příklad

Následující příklad ukazuje, jak správně porovnání řetězců, jejichž hodnoty se nezmění založenou na národním prostředí uživatele počítače.Kromě toho také ukazuje interning řetězec funkce jazyka C#.Když program deklaruje dvě nebo více identické řetězcové proměnné, kompilátor je uloží všechny na stejném místě.Voláním ReferenceEquals metoda, uvidíte, že dva řetězce ve skutečnosti odkazují na stejný objekt v paměti.Použití String.Copy metodu k zamezení interning, jak je znázorněno v příkladu.

// Internal strings that will never be localized. 
string root = @"C:\users";
string root2 = @"C:\Users";

// Use the overload of the Equals method that specifies a StringComparison. 
// Ordinal is the fastest way to compare two strings. 
bool result = root.Equals(root2, StringComparison.Ordinal);

Console.WriteLine("Ordinal comparison: {0} and {1} are {2}", root, root2,
                    result ? "equal." : "not equal.");

// To ignore case means "user" equals "User". This is the same as using 
// String.ToUpperInvariant on each string and then performing an ordinal comparison.
result = root.Equals(root2, StringComparison.OrdinalIgnoreCase);
Console.WriteLine("Ordinal ignore case: {0} and {1} are {2}", root, root2,
                     result ? "equal." : "not equal.");

// A static method is also available. 
bool areEqual = String.Equals(root, root2, StringComparison.Ordinal);


// String interning. Are these really two distinct objects? 
string a = "The computer ate my source code.";
string b = "The computer ate my source code.";

// ReferenceEquals returns true if both objects 
// point to the same location in memory. 
if (String.ReferenceEquals(a, b))
    Console.WriteLine("a and b are interned.");
else
    Console.WriteLine("a and b are not interned.");

// Use String.Copy method to avoid interning. 
string c = String.Copy(a);

if (String.ReferenceEquals(a, c))
    Console.WriteLine("a and c are interned.");
else
    Console.WriteLine("a and c are not interned.");

// Output: 
// Ordinal comparison: C:\users and C:\Users are not equal. 
// Ordinal ignore case: C:\users and C:\Users are equal. 
// a and b are interned. 
// a and c are not interned.

Následující příklad ukazuje, jak porovnání řetězců upřednostňovaný způsob pomocí String metod, které přijímají StringComparison výčtu.Všimněte si, že String.CompareTo instanční metody nejsou použity žádné přetížení má StringComparison.

// "They dance in the street." 
// Linguistically (in Windows), "ss" is equal to 
// the German essetz: 'ß' character in both en-US and de-DE cultures. 
string first = "Sie tanzen in die Straße."; 
string second = "Sie tanzen in die Strasse.";

Console.WriteLine("First sentence is {0}", first);
Console.WriteLine("Second sentence is {0}", second);

// Store CultureInfo for the current culture. Note that the original culture 
// can be set and retrieved on the current thread object.
System.Threading.Thread thread = System.Threading.Thread.CurrentThread;
System.Globalization.CultureInfo originalCulture = thread.CurrentCulture;

// Set the culture to en-US.
thread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

// For culture-sensitive comparisons, use the String.Compare  
// overload that takes a StringComparison value. 
int i = String.Compare(first, second, StringComparison.CurrentCulture);
Console.WriteLine("Comparing in {0} returns {1}.", originalCulture.Name, i);

// Change the current culture to Deutch-Deutchland.
thread.CurrentCulture = new System.Globalization.CultureInfo("de-DE");
i = String.Compare(first, second, StringComparison.CurrentCulture);
Console.WriteLine("Comparing in {0} returns {1}.", thread.CurrentCulture.Name, i);

// For culture-sensitive string equality, use either StringCompare as above 
// or the String.Equals overload that takes a StringComparison value.
thread.CurrentCulture = originalCulture;
bool b = String.Equals(first, second, StringComparison.CurrentCulture);
Console.WriteLine("The two strings {0} equal.", b == true ? "are" : "are not");

/*
 * Output:
    First sentence is Sie tanzen in die Straße.
    Second sentence is Sie tanzen in die Strasse.
    Comparing in en-US returns 0.
    Comparing in de-DE returns 0.
    The two strings are equal.
 */

Následující příklad ukazuje způsob řazení a hledání řetězce v poli způsobem zohledňující jazykovou verzi pomocí statické Array metod, které přijímají StringComparer parametr.

class SortStringArrays
    {
        static void Main()
        {

            string[] lines = new string[]
            {
                @"c:\public\textfile.txt",
                @"c:\public\textFile.TXT",
                @"c:\public\Text.txt",
                @"c:\public\testfile2.txt"
            };

            Console.WriteLine("Non-sorted order:");
            foreach (string s in lines)
            {
                Console.WriteLine("   {0}", s);
            }

            Console.WriteLine("\n\rSorted order:");

            // Specify Ordinal to demonstrate the different behavior.
            Array.Sort(lines, StringComparer.Ordinal);

            foreach (string s in lines)
            {
                Console.WriteLine("   {0}", s);
            }


            string searchString = @"c:\public\TEXTFILE.TXT";
            Console.WriteLine("Binary search for {0}", searchString);
            int result = Array.BinarySearch(lines, searchString, StringComparer.OrdinalIgnoreCase);
            ShowWhere<string>(lines, result);

            //Console.WriteLine("{0} {1}", result > 0 ? "Found" : "Did not find", searchString);

            // Keep the console window open in debug mode.
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }

        // Displays where the string was found, or, if not found, 
        // where it would have been located. 
        private static void ShowWhere<T>(T[] array, int index)
        {
            if (index < 0)
            {
                // If the index is negative, it represents the bitwise 
                // complement of the next larger element in the array.
                index = ~index;

                Console.Write("Not found. Sorts between: ");

                if (index == 0)
                    Console.Write("beginning of array and ");
                else
                    Console.Write("{0} and ", array[index - 1]);

                if (index == array.Length)
                    Console.WriteLine("end of array.");
                else
                    Console.WriteLine("{0}.", array[index]);
            }
            else
            {
                Console.WriteLine("Found at index {0}.", index);
            }
        }


    }
    /*
     * Output:
        Non-sorted order:
           c:\public\textfile.txt
           c:\public\textFile.TXT
           c:\public\Text.txt
           c:\public\testfile2.txt

        Sorted order:
           c:\public\Text.txt
           c:\public\testfile2.txt
           c:\public\textFile.TXT
           c:\public\textfile.txt
        Binary search for c:\public\TEXTFILE.TXT
        Found at index 2.
     */

Kolekce tříd, například Hashtable, Dictionary, a List mít konstruktory, které StringComparer parametr je typu prvků nebo klíče string.Obecně by měl použít tyto konstruktory, kdykoli je to možné a určit buď Ordinal nebo OrdinalIgnoreCase.

Viz také

Referenční dokumentace

CultureInfo

StringComparer

Koncepty

Porovnání řetězců v .NET Frameworku

Další zdroje

Řetězce (Průvodce programováním v C#)

Globalizace a lokalizace aplikací