.net 在StringComparison和StringComparier之间转换的优雅方式?

.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

有些.NET方法用作参数,有些使用(通常以的形式)。区别是显而易见的。是否有一些优雅的方法可以从StringComparer获取StringComparation,或者从StringComparer获取StringComparation


我总是可以编写使用
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");
    }