有些.NET方法使用StringComparison作为参数,有些使用StringComparer(通常以IComparer的形式)。区别很明显。有没有什么优雅的方法可以从StringComparer获得StringComparison,反之亦然?
我总是可以编写使用Case
语句的简单方法,但也许在.NET中已经存在一些我忽略的东西。
有些.NET方法使用StringComparison作为参数,有些使用StringComparer(通常以IComparer的形式)。区别很明显。有没有什么优雅的方法可以从StringComparer获得StringComparison,反之亦然?
我总是可以编写使用Case
语句的简单方法,但也许在.NET中已经存在一些我忽略的东西。
6条答案
按热度按时间avwztpqn1#
从
StringComparison
升级到StringComparer
非常简单-只需创建一个Dictionary<StringComparison, StringComparer>
:每个
StringComparison
值都有一个StringComparer
,所以这种方法很容易实现。请注意,StringComparer.CurrentCulture
取决于当前线程的区域性-所以如果您填充字典,然后修改线程的区域性(或者从具有不同区域性的不同线程执行此操作),您可能会得到错误的值。您可能需要一个Dictionary<StringComparison, Func<StringComparer>>
:然后,您可以随时通过调用委托来获取比较器:
另一种方法是不可行的,因为不是每个
StringComparer
* 都有 * 一个合适的StringComparison
。例如,假设我(在英国)为法语(StringComparer.Create(new CultureInfo(..., true))
创建了一个StringComparer
。这表示哪个StringComparison
?它对于当前区域性、不变区域性或序号比较都不正确。h9vpoimq2#
没有现成的东西,但是您可以自己在比较和比较器之间创建一个简单的Map:
当您需要合适的比较器时:
使用C#-6字典初始化程序语法:
此外,Jons answer还涉及线程current-culture的问题,我已将其丢弃,可能应该将其考虑在内
dxpyg8gm3#
基于接受答案的vb.net版本(和
Option Infer Off
):用法:
xkftehaa4#
isr3a4wc5#
一个完整的扩展方法,任何人谁需要快速复制+粘贴:
rggaifut6#
对于.NET Core 2.0或更高版本以及.NET Standard 2.1,您可以使用
https://learn.microsoft.com/en-us/dotnet/api/system.stringcomparer.fromcomparison