2016-06-14 3 views
3

Я пытаюсь перенаправить переносимую библиотеку C# для .Net core 1.0.Как создать StringComparer для разных языков в .Net Core?

Я использовал, чтобы сделать что-то вроде этого, чтобы получить строку компаратор для другого языка, как только я получил объект CultureInfo для языка (с помощью делегата, установленного абонентом):

IComparer<T> comparer = (IComparer<T>)StringComparer.Create(cultureInfo, caseInsensitive); 

.Net Ядра в настоящее время, похоже, поддерживает его только для текущей культуры через такие свойства, как StringComparer.CurrentCulture.

Есть ли способ получить сопоставитель строк для данного языка или культуры?

Это важно для приложения, которое одновременно использует несколько языков, таких как приложение для изучения языка.

+0

Рассмотрите сообщение об этом ограничении на GitHub. Возможно, это был просто недосмотр. Похоже на то. – usr

ответ

4

Из docs:

Каждый вызов CurrentCulture свойство ПОЛУЧИТЬ аксессору возвращает новый объект StringComparer как показано в следующем коде.

Таким образом, вы можете установить Thread.CurrentThread.CurrentCulture до желаемой культуры, а затем захватить StringComparer для этой культуры с помощью StringComparer.CurrentCulture, затем установите Thread.CurrentThread.CurrentCulture к следующей желаемой культуре, а затем захватить другой StringComparer ... и т.д.

1

StringComparer.Create был добавлен в .NET Standard 2.0, поэтому вы можете просто использовать его сейчас.

Однако, если вы хотите настроить таргетинг на более ранние версии, в .NET Standard 1.0 работает следующее. Он обеспечивает те же функции, инкапсулируя CompareInfo (который доступен) в класс, который реализует интерфейс IComparer<string>.

public class CultureAwareStringComparer : IComparer<string> 
{ 
    private readonly CompareOptions _options; 
    private readonly CompareInfo _compareInfo; 

    public CultureAwareStringComparer(CultureInfo culture, CompareOptions options) 
    { 
     _options = options; 
     _compareInfo = culture.CompareInfo; 
    } 

    public int Compare(string x, string y) 
    { 
     return _compareInfo.Compare(x, y, _options); 
    } 
} 
Смежные вопросы