C# 如何在.NETCore中为不同语言创建StringComparer?

C# 如何在.NETCore中为不同语言创建StringComparer?,c#,portable-class-library,coreclr,C#,Portable Class Library,Coreclr,我正在尝试为.NETCore1.0重新定位一个可移植的C#库 我曾经做过类似的事情来获取另一种语言的字符串比较器,一旦我获得了该语言的CultureInfo对象(通过调用方设置的委托): IComparer comparer=(IComparer)StringComparer.Create(cultureInfo,不区分大小写); .Net Core目前似乎仅通过StringComparer.CurrentCulture等属性为当前区域性支持它 有没有一种方法可以获取给定语言或区域性的字符串比

我正在尝试为.NETCore1.0重新定位一个可移植的C#库

我曾经做过类似的事情来获取另一种语言的字符串比较器,一旦我获得了该语言的CultureInfo对象(通过调用方设置的委托):

IComparer comparer=(IComparer)StringComparer.Create(cultureInfo,不区分大小写);
.Net Core目前似乎仅通过StringComparer.CurrentCulture等属性为当前区域性支持它

有没有一种方法可以获取给定语言或区域性的字符串比较器

这对于同时使用多种语言的应用程序非常重要,例如用于语言学习的应用程序。

来自:

CurrentCulture
属性get访问器的每次调用都会返回一个新的
StringComparer
对象,如下代码所示


因此,您可以将
Thread.CurrentThread.CurrentCulture
设置为所需的区域性,然后使用
StringComparer.CurrentCulture
获取该区域性的
StringComparer
,然后将
Thread.CurrentThread.CurrentCulture
设置为下一个所需的区域性,然后获取另一个
StringComparer
。。。等等。

StringComparer.Create
是在.NET标准2.0中添加的,所以您现在就可以使用它了

但是,如果您希望以早期版本为目标,则在.NET Standard 1.0中可以使用以下内容。它通过将
CompareInfo
(可用)封装在实现
IComparer
接口的类中,提供了相同的功能

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);
    }
}
公共类CultureWareStringComparer:IComparer
{
私有只读比较选项;
私有只读CompareInfo\u CompareInfo;
公共文化WareStringComparer(文化信息文化,比较选项)
{
_选项=选项;
_compareInfo=culture.compareInfo;
}
公共整数比较(字符串x、字符串y)
{
返回_compareInfo.Compare(x,y,_选项);
}
}

考虑在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);
    }
}