【问题标题】:Why should I convert a string to upper case when comparing?比较时为什么要将字符串转换为大写?
【发布时间】:2010-12-20 20:12:11
【问题描述】:

我经常读到将字符串转换为大写是一种很好的做法(我认为 Hanselman 很久以前在他的博客上提到过这一点),当该字符串要与另一个字符串进行比较时(也应该转换为大写)。

这样做有什么好处?为什么我应该这样做(或者在某些情况下我不应该这样做)?

谢谢

【问题讨论】:

标签: c#


【解决方案1】:

不,您应该使用允许不区分大小写比较的 enum 选项 (string comparison)。

确保使用您正在使用的比较方法的重载,即String.CompareString.Equals

【讨论】:

    【解决方案2】:

    在进行比较时应该转换为大写而不是小写的原因(实际上不可能进行不区分大小写的比较),因为某些(不那么常用的)字符不会转换为小写不会丢失信息。

    某些大写字符没有等效的小写字符,因此将它们设为小写会将它们转换为不同的小写字符。这可能会导致比较中出现误报。

    【讨论】:

    • 您可能应该澄清“在某些非英语语言中”
    【解决方案3】:

    进行不区分大小写的字符串比较的更好方法是:

    bool ignoreCase = true;
    bool stringsAreSame = (string.Compare(str1, str2, ignoreCase) == 0) 
    

    另外,请参见此处: Upper vs Lower Case

    【讨论】:

    • 我宁愿使用StringComparison.OrdinalIgnoreCase 而不是带有bool 参数的那个,因为它更清楚。
    【解决方案4】:

    字符串应规范化为大写。一小部分字符在转换为小写时不能往返。往返意味着将字符从一种语言环境转换到另一种以不同方式表示字符数据的语言环境,然后从转换后的字符中准确地检索出原始字符。

    参考

    https://docs.microsoft.com/en-us/visualstudio/code-quality/ca1308-normalize-strings-to-uppercase?view=vs-2015][1]

    【讨论】:

      【解决方案5】:

      这听起来像是一种进行不区分大小写比较的廉价方法。我想知道是否没有一个函数可以为你做到这一点,而你不必明确告诉它变成大写。

      【讨论】:

        【解决方案6】:

        .Net 框架在进行大写字母之间的字符串比较时比在小写字母之间进行字符串比较要快一些。

        正如其他人所提到的,从大写转换为小写时可能会丢失一些信息。

        您可能想尝试使用StringComparer 对象进行不区分大小写的比较。

        StringComparer comparer = StringComparer.OrdinalIgnoreCase;
        bool isEqualV1 = comparer.Equals("stringA", "stringB");
        bool isEqualV2 = (comparer.Compare("stringA", "stringB") == 0);
        

        从 4.7 开始的 .Net 框架有一个 Span 类型,在某些情况下应该有助于加快字符串比较。

        根据您的用例,您可能希望使用 HashSetDictionary 类型的构造函数,它们可以将 StringComparer 作为构造函数的输入参数。

        我通常使用 StringComparer 作为默认为 StringComparer.OrdingalIgnoreCase 的方法的输入参数,如果速度很重要,我会尝试使用其他技术(使用 HashSet、字典或 Spans)。

        【讨论】:

          【解决方案7】:

          您不必将字符串转换为大写。将其转换为小写 8-)

          【讨论】:

            猜你喜欢
            • 2016-03-11
            • 2018-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-03
            • 2015-07-12
            相关资源
            最近更新 更多