2010-05-27 4 views
7

Non capisco completamente il secondo parametro di string.Equals, e questo perché non riesco a trovare alcun esempio di quando effettivamente farebbe la differenza. Ad esempio, l'esempio qui riportato è lo stesso, indipendentemente dal valore del secondo parametro (a parte IgnoreCase): http://msdn.microsoft.com/en-us/library/c64xh8f9.aspxEsempio di quando il parametro cultura di string.Equals (C#) fa effettivamente la differenza?

sto solo parlando dei valori StringComparison.CurrentCulture, InvariantCulture, o ordinale.
Posso capire la differenza tra questi e i loro equivalenti IgnoreCase.

risposta

4

This pagina MSDN (Best Practices per l'utilizzo stringhe in .NET Framework) ha un sacco di informazioni su come utilizzare le stringhe e il seguente esempio è tratto da esso:

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

Grazie, che è esattamente quello che stavo cercando. Ha almeno due esempi: \ u0000 è uguale a un carattere null se il parametro è cultura invariante, ma non se è ordinale. \ u0061 \ u030a è uguale a \ u00e5 se il parametro è cultura invariante, ma non se è ordinale. – zod

3

Differenze tra StringComparison.InvariantCulture e StringComparison.Ordinal sono abbastanza facile da trovare, poiché Ordinal significa che la stringa non viene normalizzata prima di essere confrontata. Quindi dobbiamo solo confrontare una stringa normalizzata con una stringa non normalizzata.

Trovare le differenze tra StringComparison.InvariantCulture e StringComparison.CurrentCulture (o le differenze tra i diversi CurrentCulture s) è un po 'più difficile, ma esistono.

Ecco un esempio:

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 

O questo uno che utilizza solo caratteri 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 
Problemi correlati