【问题标题】:Which Version of StringComparer to use使用哪个版本的 StringComparer
【发布时间】:2010-09-16 08:07:17
【问题描述】:

如果我想要一个不区分大小写的字符串键字典,考虑到这些约束,我应该使用哪个版本的 StringComparer:

  • 字典中的键来自 C# 代码或仅以英语语言环境(美国或英国)编写的配置文件
  • 该软件已国际化,可在不同区域运行

我通常使用 StringComparer.InvariantCultureIgnoreCase 但不确定这是否正确。这是示例代码:

Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase);

【问题讨论】:

    标签: c# .net string internationalization


    【解决方案1】:

    比较器分为三种:

    • 文化意识
    • 文化不变性
    • 序数

    每个比较器都有一个区分大小写和一个不区分大小写版本。

    序数比较器使用字符的序数值。这是最快的比较器,它应该用于内部目的。

    culture-aware比较器考虑特定于当前线程文化的方面。它知道“土耳其语 i”、“西班牙语 LL”等问题。它应该用于 UI 字符串。

    culture invariant 比较器实际上没有定义,会产生不可预知的结果,因此根本不应该使用。

    参考文献

    1. New Recommendations for Using Strings in Microsoft .NET 2.0

    【讨论】:

    • 这很好,很甜蜜。我更喜欢不变文化的一种情况是查看 db..
    【解决方案2】:

    This MSDN article 涵盖了您可能想深入了解的所有内容,包括土耳其语-I 问题。

    我已经有一段时间没有阅读它了,所以我要再次阅读它。一小时后见!

    【讨论】:

    • 添加您发现了什么?现在不鼓励简单的链接答案:/
    【解决方案3】:

    “不区分大小写”的概念是一种语言概念,因此没有文化就没有意义。

    请参阅此blog 了解更多信息。

    也就是说,如果您只是在谈论使用拉丁字母的字符串,那么您可能会摆脱 InvariantCulture。

    不过,最好使用 StringComparer.CurrentCulture 创建字典。例如,这将允许“ß”在您的字典中匹配德国文化下的“ss”。

    【讨论】:

      【解决方案4】:

      由于键是您已知的固定值,因此 InvariantCultureIgnoreCase 或 OrdinalIgnoreCase 应该可以工作。避免特定于文化的问题,否则您可能会遇到一些更“有趣”的事情,例如“土耳其语 i”问题。显然,如果您要比较有文化的价值观,您会使用有文化的比较器……但听起来您不是。

      【讨论】:

        【解决方案5】:

        StringComparer.OrdinalIgnoreCase 比 InvariantCultureIgnoreCase FWIW 稍快(根据MSDN,“序数比较很快,但对文化不敏感”。

        当然,您必须进行大量比较才能注意到差异。

        【讨论】:

          【解决方案6】:

          Invariant Culture 专门用于处理程序内部的字符串,与用户数据或 UI 无关。听起来这种情况就是这样。

          【讨论】:

            【解决方案7】:

            System.Collections.Specialized 包括 StringDictionary。 MSDN 的备注部分指出“键不能为空,但值可以。

            密钥以不区分大小写的方式处理;它在与字符串字典一起使用之前被翻译成小写。

            在 .NET Framework 1.0 版中,此类使用区分区域性的字符串比较。但是,在 .NET Framework 1.1 版及更高版本中,此类在比较字符串时使用 CultureInfo.InvariantCulture。有关文化如何影响比较和排序的详细信息,请参阅比较和排序特定文化的数据和执行不区分文化的字符串操作。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-12-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-24
              • 1970-01-01
              • 2016-11-03
              • 1970-01-01
              相关资源
              最近更新 更多