.net 在StringComparison和StringComparier之间转换的优雅方式?
有些.NET方法用作参数,有些使用(通常以的形式)。区别是显而易见的。是否有一些优雅的方法可以从StringComparer获取StringComparation,或者从StringComparer获取StringComparation.net 在StringComparison和StringComparier之间转换的优雅方式?,.net,string,string-comparison,vb.net,.net,String,String Comparison,Vb.net,有些.NET方法用作参数,有些使用(通常以的形式)。区别是显而易见的。是否有一些优雅的方法可以从StringComparer获取StringComparation,或者从StringComparer获取StringComparation 我总是可以编写使用Case语句的简单方法,但在.NET中可能已经有我忽略的东西。没有现成的东西,但是您可以自己在比较和比较程序之间创建一个简单的映射: Dictionary<StringComparison, StringComparer> comp
我总是可以编写使用
Case
语句的简单方法,但在.NET中可能已经有我忽略的东西。没有现成的东西,但是您可以自己在比较和比较程序之间创建一个简单的映射:
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
};
字典比较与比较=
新词典
{
[StringComparison.CurrentCulture]=StringComparier.CurrentCulture,
[StringComparison.CurrentCultureInoRecase]=StringComparier.CurrentCultureInoRecase,
[StringComparison.InvariantCulture]=StringComparier.InvariantCulture,
[StringComparison.InvariantCultureIgnoreCase]=StringComparier.InvariantCultureIgnoreCase,
[StringComparison.Ordinal]=StringComparier.Ordinal,
[StringComparison.OrdinalIgnoreCase]=StringComparier.OrdinalIgnoreCase
};
此外,还提到了线程当前文化的问题,我已经放弃了它,可能应该考虑到它从
StringComparison
到stringcomparier
很简单-只需创建一个字典
:
然后,您可以通过调用委托随时获取比较器:
var comparer = map[comparison]();
走另一条路是不可行的,因为不是每个StringComparer
都有合适的stringcomparation
。例如,假设我(在英国)为法语(StringComparer.create(new CultureInfo(…,true))
创建了一个StringComparer
。它代表的是哪个stringcomparator
?对于当前区域性、不变区域性或顺序比较是不正确的。基于公认答案的版本(和选项推断关闭
):
Dim map作为新字典(用于StringComparison,Func(用于StringComparier))()_
从{
{StringComparison.CurrentCulture,函数()StringComparier.CurrentCulture},
{StringComparison.CurrentCultureIgnoreCase,函数()StringComparier.CurrentCultureIgnoreCase},
{StringComparison.InvariantCulture,Function()StringComparier.InvariantCulture},
{StringComparison.InvariantCultureIgnoreCase,Function()StringComparier.InvariantCultureIgnoreCase},
{StringComparison.Ordinal,Function()StringComparier.Ordinal},
{StringComparison.OrdinalIgnoreCase,Function()StringComparier.OrdinalIgnoreCase}
}
用法:
Dim比较器作为StringComparer=map(比较)()
一个完整的扩展方法,适用于任何需要快速复制+粘贴的用户:
public static class StringComparisonExtensions
{
// from http://stackoverflow.com/a/32764112/548304
private static readonly Dictionary<StringComparison, Func<StringComparer>> ComparsionToComparer =
new Dictionary<StringComparison, Func<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
};
/// <summary>
/// Retrieves a string comparer for the given StringComparison.
/// </summary>
public static StringComparer ToComparer(this StringComparison comparison)
{
return ComparsionToComparer.GetValueOrDefault(comparison)?.Invoke();
}
}
公共静态类StringComparisonExtrains
{
//从http://stackoverflow.com/a/32764112/548304
专用静态只读字典与Comparer的比较=
新词典
{
[StringComparison.CurrentCulture]=()=>StringComparier.CurrentCulture,
[StringComparison.CurrentCultureInoRecase]=()=>StringComparier.CurrentCultureInoRecase,
[StringComparison.InvariantCulture]=()=>StringComparier.InvariantCulture,
[StringComparison.InvariantCultureInoRecase]=()=>StringComparier.InvariantCultureInoRecase,
[StringComparison.Ordinal]=()=>StringComparier.Ordinal,
[StringComparison.OrdinalIgnoreCase]=()=>StringComparier.OrdinalIgnoreCase
};
///
///检索给定StringComparison的字符串比较器。
///
公共静态StringComparer到Comparer(此StringComparer)
{
返回ComparisonToComparer.GetValueOrDefault(比较)?.Invoke();
}
}
是的,这基本上就是我要做的。在编码之前,我问.NET里面是否已经有类似的东西。@miroxlav我知道没有一个现有的映射。根据Jon的回答,我想我可能理解为什么没有这样的东西。它可能不像乍一看那么简单。@miroxlav是的不太难,但有些事情可能很难搞定,我同意。谢谢你展示了“动态映射”在文化可能发生变化的地方很有用。也许我也理解为什么事情不是那么简单,.NET会提供开箱即用的。
var comparer = map[comparison]();
public static class StringComparisonExtensions
{
// from http://stackoverflow.com/a/32764112/548304
private static readonly Dictionary<StringComparison, Func<StringComparer>> ComparsionToComparer =
new Dictionary<StringComparison, Func<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
};
/// <summary>
/// Retrieves a string comparer for the given StringComparison.
/// </summary>
public static StringComparer ToComparer(this StringComparison comparison)
{
return ComparsionToComparer.GetValueOrDefault(comparison)?.Invoke();
}
}
public static StringComparer ToComparer(this StringComparison comparison)
{
switch (comparison) {
case StringComparison.CurrentCulture:
return StringComparer.CurrentCulture;
case StringComparison.CurrentCultureIgnoreCase:
return StringComparer.CurrentCultureIgnoreCase;
case StringComparison.InvariantCulture:
return StringComparer.InvariantCulture;
case StringComparison.InvariantCultureIgnoreCase:
return StringComparer.InvariantCultureIgnoreCase;
case StringComparison.Ordinal:
return StringComparer.Ordinal;
case StringComparison.OrdinalIgnoreCase:
return StringComparer.OrdinalIgnoreCase;
default:
break;
}
throw new NotImplementedException("Unknown StringComparison");
}