2016-06-14 17 views
3

Ich versuche, eine portable C# -Bibliothek für .NET Core 1.0 neu zu target.Wie erstellt man StringComparer für verschiedene Sprachen in .Net Core?

habe ich so etwas tun, um eine Zeichenfolge comparer für eine andere Sprache zu bekommen, sobald ich ein Cultureinfo-Objekt für die Sprache erhalten (über einen Delegaten vom Anrufer eingestellt):

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

.Net Kern Derzeit scheint es nur für die aktuelle Kultur über Eigenschaften wie StringComparer.CurrentCulture zu unterstützen.

Gibt es eine Möglichkeit, einen Zeichenfolgenvergleich für eine bestimmte Sprache oder Kultur zu erhalten?

Dies ist wichtig für eine App, die mehrere Sprachen gleichzeitig verwendet, z. B. eine App zum Sprachenlernen.

+0

Berücksichtigen Sie diese Einschränkung auf GitHub. Vielleicht war es nur ein Versehen. Schaut so aus. – usr

Antwort

4

Vom docs:

Jeder Aufruf der CurrentCulture Eigenschaft get-Accessor gibt ein neues StringComparer Objekt, wie der folgende Code zeigt.

So konnten Sie Thread.CurrentThread.CurrentCulture auf die gewünschte Kultur gesetzt, dann die StringComparer für diese Kultur greifen StringComparer.CurrentCulture verwenden, dann stellen Sie den Thread.CurrentThread.CurrentCulture auf die nächste gewünschte Kultur, dann eine andere StringComparer greifen ... etc.

1

StringComparer.Create wurde in .NET Standard 2.0 hinzugefügt, so dass Sie es jetzt einfach verwenden können.

Wenn Sie jedoch frühere Versionen als Ziel verwenden möchten, funktioniert das folgende in .NET Standard 1.0. Es bietet dieselbe Funktionalität, indem es die CompareInfo (die verfügbar ist) in einer Klasse einkapselt, die die IComparer<string>-Schnittstelle implementiert.

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