2016-06-14 3 views
3

J'essaye de recibler une bibliothèque C# portative pour le noyau .Net 1.0.Comment créer StringComparer pour différentes langues dans .Net Core?

Je l'habitude de faire quelque chose comme ça pour obtenir un comparateur de chaîne pour une autre langue, une fois que j'ai obtenu un objet CultureInfo pour la langue (via un délégué défini par l'appelant):

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

.Net de base semble actuellement ne le supporter que pour la culture actuelle via des propriétés comme StringComparer.CurrentCulture.

Est-il possible d'obtenir un comparateur de chaînes pour une langue ou une culture donnée?

Ceci est important pour une application qui utilise plusieurs langues simultanément, comme une application pour l'apprentissage des langues.

+0

Peut-être que c'était juste un oubli. On dirait ça. – usr

Répondre

4

De l'docs:

Chaque appel à l'accesseur de propriété CurrentCulture retourne un nouvel objet StringComparer, comme le montre le code suivant.

Ainsi, vous pouvez définir Thread.CurrentThread.CurrentCulture à la culture désirée, puis saisir la StringComparer pour cette culture en utilisant StringComparer.CurrentCulture, puis définissez le Thread.CurrentThread.CurrentCulture à la culture suivante souhaitée, puis prendre un autre StringComparer ... etc.

1

StringComparer.Create a été ajouté à .NET Standard 2.0, vous pouvez donc l'utiliser maintenant. Toutefois, si vous souhaitez cibler des versions antérieures, voici ce qui fonctionne dans .NET Standard 1.0. Il fournit la même fonctionnalité, en encapsulant le CompareInfo (qui est disponible) dans une classe qui implémente l'interface IComparer<string>. Envisager de rapporter cette limitation sur GitHub.

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); 
    } 
}