【问题标题】:strange thing about strings comparison字符串比较的奇怪之处
【发布时间】:2011-05-06 00:39:15
【问题描述】:

这段代码:

        Console.WriteLine("~".CompareTo("a") > 0);
        Console.WriteLine('~'.CompareTo('a') > 0);

给我:

False
True

WTF?

【问题讨论】:

    标签: c# .net .net-3.5 .net-4.0


    【解决方案1】:

    myChar.CompareTo(otherChar) 仅通过它们的 unicode 值比较两个字符。

    myString.CompareTo(otherString) 使用当前文化的排序比较器,它可以以更词汇的方式实现。

    【讨论】:

      【解决方案2】:

      显示这种行为的另一种方式是:

      Console.WriteLine("a".CompareTo("b")); // -1 
      Console.WriteLine("b".CompareTo("a")); // 1
      Console.WriteLine('a'.CompareTo('b')); // -1 
      Console.WriteLine('b'.CompareTo('a')); // 1
      
      Console.WriteLine("~".CompareTo("a")); // -1
      Console.WriteLine("a".CompareTo("~")); // 1
      Console.WriteLine('~'.CompareTo('a')); // 29
      Console.WriteLine('a'.CompareTo('~')); // -29
      

      差异可能很微妙,但它是documentedChar.CompareTo(Char) 中的比较是

      基于 此实例的编码值 和价值,不是他们的字典 特征

      同时,documentationString.CompareTo(String)

      执行一个单词(区分大小写和 文化敏感)比较使用 当前的文化

      即第一个基于顺序进行比较,后者基于当前文化中的默认规则(您可能在字典中看到的顺序)。

      【讨论】:

        【解决方案3】:

        我认为myString.CompareTo(otherString) 返回与CultureInfo.CurrentCulture.CompareInfo.Compare(myString,otherString,CompareOptions.None) 相同的值,即进行与文化相关的比较。

        在大多数文化中,非字母字符在字母之前排序,因此'~' 排在'a' 之前。

        另一方面,

        'char.CompareTo(otherChar)` 只是比较 unicode 值(即 'a' 的 97 与 '~' 的 126),因此返回不同的结果。

        【讨论】:

          【解决方案4】:

          要以与字符相同的方式比较字符串(仅按字符代码的顺序),您必须使用序数比较:

          Console.WriteLine(String.Compare("~", "a", StringComparison.Ordinal) > 0);
          

          输出:

          True
          

          【讨论】:

            猜你喜欢
            • 2011-09-18
            • 2011-04-07
            • 1970-01-01
            • 2014-10-22
            • 2019-10-26
            • 2011-09-13
            • 1970-01-01
            • 2021-09-07
            • 2012-02-24
            相关资源
            最近更新 更多