一些.NET方法使用StringComparison作为参数,有些方法使用StringComparer (通常以IComparer的形式出现)。差别是很明显的。有什么优雅的方法可以从StringComparison中获取StringComparer,反之亦然?
我总是可以编写使用Case语句的简单方法,但也许.NET中已经有我忽略的东西。
发布于 2015-09-24 14:34:19
从StringComparison到StringComparer很简单--只需创建一个Dictionary<StringComparison, StringComparer>
var map = new Dictionary<StringComparison, StringComparer>
{
{ StringComparison.Ordinal, StringComparer.Ordinal },
// etc
};每个StringComparer值都有一个StringComparison,因此这种方法非常容易工作。请注意,StringComparer.CurrentCulture取决于当前的线程区域性--因此,如果您填充字典,然后修改线程的区域性(或者使用不同的区域性从不同的线程进行修改),您可能会得到错误的值。你可能想要一个Dictionary<StringComparison, Func<StringComparer>>
var map = new Dictionary<StringComparison, Func<StringComparer>>
{
{ StringComparison.Ordinal, () => StringComparer.Ordinal },
// etc
};然后,通过调用委托,您可以在任何时候获得比较器:
var comparer = map[comparison]();另一种方式是不可行的,因为并非每个StringComparer都有合适的StringComparison。例如,假设我(在英国)为法语(StringComparer.Create(new CultureInfo(..., true)) )创建了一个StringComparer.Create(new CultureInfo(..., true))。这代表了哪个StringComparison?对于当前的区域性、不变的区域性或顺序比较来说,这是不正确的。
发布于 2015-09-24 14:34:16
没有现成的东西,但是您可以在比较器和比较器之间创建一个简单的映射:
Dictionary<StringComparison, StringComparer> comparsionToComparer =
new Dictionary<StringComparison, System.StringComparer>
{
{ StringComparison.CurrentCulture, StringComparer.CurrentCulture },
{ StringComparison.CurrentCultureIgnoreCase, StringComparer.CurrentCultureIgnoreCase },
{ StringComparison.InvariantCulture, StringComparer.InvariantCulture },
{ StringComparison.InvariantCultureIgnoreCase, StringComparer.InvariantCultureIgnoreCase },
{ StringComparison.Ordinal, StringComparer.Ordinal },
{ StringComparison.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase }
}当你需要合适的人时:
var invariantComparer = comparsionToComparer[StringComparsion.InvariantCulture];编辑:
使用C#-6字典初始化器语法:
Dictionary<StringComparison, StringComparer> comparsionToComparer =
new Dictionary<StringComparison, System.StringComparer>
{
[StringComparison.CurrentCulture] = StringComparer.CurrentCulture,
[StringComparison.CurrentCultureIgnoreCase] = StringComparer.CurrentCultureIgnoreCase,
[StringComparison.InvariantCulture] = StringComparer.InvariantCulture,
[StringComparison.InvariantCultureIgnoreCase] = StringComparer.InvariantCultureIgnoreCase,
[StringComparison.Ordinal] = StringComparer.Ordinal,
[StringComparison.OrdinalIgnoreCase] = StringComparer.OrdinalIgnoreCase
};另外,Jons回答提到线程当前区域性的问题,我放弃了这个问题,可能应该考虑到这个问题。
发布于 2015-09-24 22:22:25
基于接受答案的vb.net版本(和Option Infer Off):
Dim map As New Dictionary(Of StringComparison, Func(Of StringComparer))() _
From {
{StringComparison.CurrentCulture, Function() StringComparer.CurrentCulture},
{StringComparison.CurrentCultureIgnoreCase, Function() StringComparer.CurrentCultureIgnoreCase},
{StringComparison.InvariantCulture, Function() StringComparer.InvariantCulture},
{StringComparison.InvariantCultureIgnoreCase, Function() StringComparer.InvariantCultureIgnoreCase},
{StringComparison.Ordinal, Function() StringComparer.Ordinal},
{StringComparison.OrdinalIgnoreCase, Function() StringComparer.OrdinalIgnoreCase}
}用法:
Dim comparer As StringComparer = map(comparison)()https://stackoverflow.com/questions/32763927
复制相似问题