2010-05-27 10 views
7

Nie w pełni rozumiem drugi parametr ciągu.Equals, a to dlatego, że nie mogę znaleźć żadnych przykładów, kiedy to faktycznie robi różnicę. Na przykład, przykład jest taki sam, niezależnie od wartości drugiego parametru (oprócz ignoreCase): http://msdn.microsoft.com/en-us/library/c64xh8f9.aspxPrzykład, kiedy parametr kultury ciągu.Equals (C#) rzeczywiście robi różnicę?

jestem tylko mówić o wartościach StringComparison.CurrentCulture, InvariantCulture lub porządkowej.
Rozumiem różnicę między nimi a ich odpowiednikami IgnoreCase.

Odpowiedz

4

This MSDN strona (Best Practices for Korzystanie z ciągów w .NET Framework) ma wiele informacji na temat korzystania z ciągów i Poniższy przykład pochodzi z nią:

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

Dzięki, to jest dokładnie to, czego szukałem. Ma co najmniej dwa przykłady: \ u0000 jest taki sam jak pusty znak, jeśli parametr jest kulturą niezmienniczą, ale nie jeśli jest porządkowy. \ u0061 \ u030a jest taki sam jak \ u00e5, jeśli parametr jest kulturą niezmienniczą, ale nie jeśli jest porządkowy. – zod

3

Różnice między StringComparison.InvariantCulture i StringComparison.Ordinal są dość łatwe do znalezienia, ponieważ porządkowe oznacza, że ​​ciąg nie jest znormalizowany przed porównaniem. Musimy po prostu porównać znormalizowany ciąg do niezormowanego ciągu.

Znalezienie różnic między StringComparison.InvariantCulture i StringComparison.CurrentCulture (lub różnic między różnymi CurrentCulture s) jest nieco trudniejsze, ale one istnieją.

Oto jeden z przykładów:

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 

Albo ten, który używa tylko znaków ASCII:

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 
Powiązane problemy