某些 .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/