.net - StringComparison 和 StringComparer 之间转换的优雅方式?

标签 .net string string-comparison

某些 .NET 方法使用 StringComparison作为参数,有些使用 StringComparer (通常采用 IComparer 的形式)。差异是显而易见的。是否有一些优雅的方法如何从 StringComparer 获取 StringComparison ,反之亦然?

我总是可以编写使用 Case 语句的简单方法,但也许 .NET 中已经存在我所忽略的内容。

最佳答案

StringComparison 出发至StringComparer很简单 - 只需创建一个 Dictionary<StringComparison, StringComparer> :

var map = new Dictionary<StringComparison, StringComparer>
{
    { StringComparison.Ordinal, StringComparer.Ordinal },
    // etc
};

有一个StringComparer对于每个 StringComparison值(value),所以这种方式很容易运作。请注意,StringComparer.CurrentCulture取决于当前的线程区域性 - 因此,如果您填充字典,然后修改线程的区域性(或从具有不同区域性的不同线程执行此操作),您最终可能会得到错误的值。您可能想要 Dictionary<StringComparison, Func<StringComparer>> :

var map = new Dictionary<StringComparison, Func<StringComparer>>
{
    { StringComparison.Ordinal, () => StringComparer.Ordinal },
    // etc
};

然后您可以随时通过调用委托(delegate)来获取比较器:

var comparer = map[comparison]();

走另一条路是不可行的,因为不是每个 StringComparer 合适的StringComparison 。例如,假设我(在英国)创建一个 StringComparer法语( StringComparer.Create(new CultureInfo(..., true)) 。这代表哪个 StringComparison ?这对于当前区域性、不变区域性或序数比较来说是不正确的。

关于.net - StringComparison 和 StringComparer 之间转换的优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32763927/

相关文章:

C#调用返回结构的golang函数

python - while循环测试

Python "ValueError: incomplete format"打印 ("stuff %"% "thingy")

javascript - JavaScript 如何比较日期字符串?

sql - 分割字符串并返回mssql中最大的

.net - Visual Studio : Compiler Warnings and errors appear twice in different languages

.net - 如何检测系统时间是否更改? (来自.net)

c# - 解析格式奇怪的 DateTime。有人愿意站出来吗?

c - 这 4 项 :character, 数组、字符串、文字之间有什么区别。在C?

php - 合并两个数组,当前导子字符串相同时用第二个数组值覆盖第一个数组值