2010-05-27 16 views
7

string.Equals'ın ikinci parametresini tam olarak anlayamıyorum ve bunun aslında ne zaman bir fark yaratacağına dair bir örnek bulamıyorum. Örneğin, burada verilen örnek bakılmaksızın (kenara ignoreCase itibaren) ikinci parametrenin değeri aynıdır: http://msdn.microsoft.com/en-us/library/c64xh8f9.aspxstring.Equals (C#) 'nin kültür parametresi ne zaman bir fark yaratır?

Sadece değerlere StringComparison.CurrentCulture, InvariantCulture veya Ordinal bahsediyorum.
Bunlarla IgnoreCase eşdeğerleri arasındaki farkı anlayabiliyorum.

cevap

4

This MSDN sayfa dizeleri kullanımı hakkında bilgi bir yeri vardır ve Aşağıdaki örnek ondan alınır (.NET Framework içinde Dizeleri Kullanımı için En İyi Uygulamalar): StringComparison.InvariantCulture ve StringComparison.Ordinal arasında

using System; 
using System.Globalization; 
using System.Threading; 

public class Example 
{ 
    public static void Main() 
    { 
     string[] values= { "able", "ångström", "apple", "Æble", 
         "Windows", "Visual Studio" }; 
     Array.Sort(values); 
     DisplayArray(values); 

     // Change culture to Swedish (Sweden). 
     string originalCulture = CultureInfo.CurrentCulture.Name; 
     Thread.CurrentThread.CurrentCulture = new CultureInfo("sv-SE"); 
     Array.Sort(values); 
     DisplayArray(values); 

     // Restore the original culture. 
     Thread.CurrentThread.CurrentCulture = new CultureInfo(originalCulture); 
    } 

    private static void DisplayArray(string[] values) 
    { 
     Console.WriteLine("Sorting using the {0} culture:", 
         CultureInfo.CurrentCulture.Name); 
     foreach (string value in values) 
     Console.WriteLine(" {0}", value); 

     Console.WriteLine(); 
    } 
} 
// The example displays the following output: 
//  Sorting using the en-US culture: 
//   able 
//   Æble 
//   ångström 
//   apple 
//   Visual Studio 
//   Windows 
//  
//  Sorting using the sv-SE culture: 
//   able 
//   Æble 
//   apple 
//   Windows 
//   Visual Studio 
//   ångström 
+0

Teşekkürler, bu benim aradığım de tam öyle

İşte bir örnek. En az iki örneği vardır: \ u0000, parametre değişmez kültür ise, boş karakterle aynıdır, ancak sıralı değilse. \ u0061 \ u030a, parametre değişmez kültür ise, ancak sıradan değilse, \ u00e5 ile aynıdır. – zod

3

farklar oldukça vardır Ordinal, karşılaştırılmadan önce dizenin normalleştirilmediği anlamına gelir. Bu yüzden normalleştirilmiş bir dizeyi normal olmayan bir dizeyle karşılaştırmalıyız.

StringComparison.InvariantCulture ve StringComparison.CurrentCulture arasındaki farklar (veya farklı CurrentCulture s arasındaki farklar) biraz daha zordur, ancak mevcutlar.

string a = "\u00C4";  // "LATIN CAPITAL LETTER A WITH DIAERESIS" 
    string b = "\u0041\u0308"; // "LATIN CAPITAL LETTER A" - "COMBINING DIAERESIS" 

    Console.WriteLine(a.Equals(b, StringComparison.InvariantCulture)); // true 

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false); 
    Console.WriteLine(a.Equals(b, StringComparison.CurrentCulture)); // true 

    Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK", false); 
    Console.WriteLine(a.Equals(b, StringComparison.CurrentCulture)); // false 

    Console.WriteLine(a.Equals(b, StringComparison.Ordinal));   // false 

Veya yalnızca ASCII karakterleri kullanır bu bir:

string ddzs = "ddzs"; 
    string dzsdzs = "dzsdzs"; 

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false); 
    Console.WriteLine(ddzs.Equals(dzsdzs, StringComparison.CurrentCulture)); // false 

    Thread.CurrentThread.CurrentCulture = new CultureInfo("hu-HU", false); 
    Console.WriteLine(ddzs.Equals(dzsdzs, StringComparison.CurrentCulture)); // true 
İlgili konular