Aracılığıyla paylaş


Nasıl yapılır: Karşılaştır dizeleri (C# Programlama Kılavuzu)

Dizeleri karşılaştırmak, belirten bir dize sonucunu üretir veya diğer'dan büyük veya eşit iki dizeyi olabilir.Sonuç belirlenir kuralları olup gerçekleştirmekte olduğunuz bağlı olarak farklı sıra karşılaştırma veya kültüre duyarlı karşılaştırma.Belirli bir görev için doğru karşılaştırma türünü kullanmak önemlidir.

Karşılaştırma veya dilbilimsel kuralları bağımsız iki dize değerlerini sıralamak varsa, temel sıra karşılaştırmalarını kullanır.Sıra temel bir karşılaştırma (System.StringComparison.Ordinal) duyarlıdır, yani iki dize karakter için karakter eşleşmesi gerekir: "ve" eşit değildir "Ve" veya "and".Sık kullanılan bir türevidir System.StringComparison.OrdinalIgnoreCase, hangi eşleşir "ve", "Ve" ve "and".StringComparison.OrdinalIgnoreCasegenellikle dosya adları, yol adları, ağ yollarını ve kullanıcının bilgisayarının yerel ayarını temel alan değeri değişmediğinde herhangi bir diğer dize karşılaştırmak için kullanılır.Daha fazla bilgi için bkz. System.StringComparison.

Kültüre duyarlı karşılaştırmalar genellikle karşılaştırmak ve karakterleri ve sıralama kurallarını bu dizeler, kullanıcının bilgisayarında yerel ayarlara bağlı olarak değişebilir çünkü son kullanıcılar tarafından Giriş dizeleri sıralama için kullanılır.Hatta aynı karakterler içeren dizeler geçerli iş parçacığının kültüre bağlı olarak farklı sıralanır.

[!NOT]

Dizeleri karşılaştırmak, ne tür bir karşılaştırma yapmak düşündüğünüz açıkça belirtmek yöntemleri kullanmanız gerekir.Bu kod çok daha sürdürülebilir ve okunabilir yapar.Mümkün olduğunda, aşırı yükleme yöntemlerinden birini kullanın System.String ve System.Array sınıfları, gerçekleştirilmesi gereken bir StringComparison numaralandırma parametresi, böylece hangi gerçekleştirilecek karşılaştırma türünü belirtebilirsiniz.Kullanmaktan kaçının en iyi == ve != dizeleri karşılaştırmak, operators.Ayrıca, kullanmaktan kaçının String.CompareTo aşırı hiçbiri aldığından yöntemleri örnek bir StringComparison.

Örnek

Aşağıdaki örnek, doğru kullanıcının bilgisayarının yerel ayarını temel alan değerleri değişmez dizeleri karşılaştırmak gösterilmiştir.Buna ek olarak, ayrıca gösterir dize interning özelliği, C#.Bir program iki veya daha fazla aynı dize değişkenleri bildirir, derleyici bunların tümü aynı konumda depolar.Çağırarak ReferenceEquals yöntemi, iki dizeyi aslında bellekte aynı nesneye başvuran olduğunu görebilirsiniz.Kullanım String.Copy interning, örnekte gösterildiği gibi önlemek için yöntem.


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

Aşağıdaki örnek kullanarak tercih edilen yol dizeleri karşılaştırmak nasıl gösterir System.String ele yöntemleri bir StringComparison numaralandırma.Dikkat edin String.CompareTo örnek yöntemleri kullanılmaz Burada, aşırı hiçbiri aldığından bir 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 current culture returns 0.
    The two strings are equal.
 */

Aşağıdaki örnek, nasıl sıralanacağını gösterir ve bir dizi kullanarak statik bir kültüre duyarlı şekilde dizeleri arama Array ele yöntemleri bir System.StringComparer parametresi.

    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.
     */

Koleksiyon sınıfları gibi System.Collections.Hashtable, System.Collections.Generic.Dictionary<TKey, TValue>, ve System.Collections.Generic.List<T> ele oluşturucuları olan bir System.StringComparer öğelerin veya anahtar türü olduğunda bir parametre string.Genel olarak, mümkün olan her durumda bu oluşturucularını kullanın ve gerekir belirtin ya da Ordinal veya OrdinalIgnoreCase.

Ayrıca bkz.

Başvuru

System.Globalization.CultureInfo

System.StringComparer

Kavramlar

Dizeleri karşılaştırma

Diğer Kaynaklar

Dizeleri (C# Programlama Kılavuzu)

Uygulamaları Genelleştirme ve Yerelleştirme