Пример, когда параметр культуры string.Equals (c #) действительно имеет значение? - PullRequest
7 голосов
/ 27 мая 2010

Я не совсем понимаю второй параметр строки. Уравнения, и это потому, что я не могу найти никаких примеров того, когда это действительно будет иметь значение. Например, приведенный здесь пример один и тот же, независимо от значения второго параметра (кроме IgnoreCase): http://msdn.microsoft.com/en-us/library/c64xh8f9.aspx

Я просто говорю о значениях StringComparison.CurrentCulture, InvariantCulture или Ordinal.
Я могу понять разницу между ними и их эквивалентами IgnoreCase.

Ответы [ 2 ]

4 голосов
/ 27 мая 2010

На этой странице MSDN (Рекомендации по использованию строк в .NET Framework) содержится много информации об использовании строк, и из нее взят следующий пример:

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
3 голосов
/ 27 мая 2010

Различия между StringComparison.InvariantCulture и StringComparison.Ordinal довольно легко найти, поскольку Ordinal означает, что строка не нормализуется перед ее сравнением. Поэтому нам просто нужно сравнить нормализованную строку с ненормализованной строкой.

Найти различия между StringComparison.InvariantCulture и StringComparison.CurrentCulture (или различиями между различными CurrentCulture с) немного сложнее, но они существуют.

Вот один пример:

    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

Или этот, который использует только символы 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...