【问题标题】:Why the capital letter is greater than small letter in .Net?为什么.Net中大写字母大于小写字母?
【发布时间】:2013-06-25 20:34:53
【问题描述】:

在 Java 中:

"A".compareTo("a"); return -32 //"A" is less than "a".

在 .Net 中,使用 String.CompareTo:

"A".CompareTo("a"); return 1 //"A" is greater than "a".

在 .Net 中,使用 Char.CompareTo:

'A'.CompareTo('a'); return -32 //"A" is less than "a".

我知道 Java 使用它在 unicode 表中的位置来比较字符串字符,但 .Net 不是。如何确定.Net中哪个大写字母大于小写字母?

String.CompareTo Method (String)

【问题讨论】:

  • 我没有在你的第二行中得到你的问题你正在比较 A 和 a 并且它给你 1 这意味着 A 大于 a 你的问题是什么意思?
  • 可能是因为locale。 (虽然我不会说 C#...)
  • 在内部我使用 InternalCompareString Windows API 函数调用,但无法找到有关它的文档。
  • 我的问题是为什么.Net确定哪个“A”大于“a”,而不是返回值1。在.Net中,String.CompareTo返回1(大于零)意味着这个实例大于strB。如果我使用 Char.CompareTo: 'A'.CompareTo('a');返回值为-32,很好,但是String.CompareTo返回1,所以我想知道为什么以及如何。
  • 正如我在下面所说的,这可能取决于您的“文化”。不知道 .NET 是什么意思……

标签: c# java compare


【解决方案1】:

doc I could find 说:

此方法使用当前区域性执行单词(区分大小写和区域性)比较。

因此,它与 Java's .compareTo() 不太一样,它默认使用 Unicode 代码点进行字典比较。

因此,在 .NET 中,这取决于您当前的“文化”(我猜 Java 会称之为“语言环境”)。

看来,如果你想在.NET中做字符串比较“à la Java”,你必须使用String.CompareOrdinal()来代替。

相反,如果你想在 Java 中进行依赖于语言环境的字符串比较,则需要使用 Collator。

最后,MSDN 上的another link 展示了文化对比较甚至字符串相等性的影响。

【讨论】:

  • 谢谢。我知道String.CompareOrdinal()。在这个问题中,我想知道如何确定.Net 中哪个大写字母大于小写字母?因为我试了代码:String.Compare("A", "a", false, CultureInfo.GetCultureInfo("en-US")),返回值为1,看不懂……
  • 嗯,这可能与文化有关。例如,尝试使用法语。我不知道文化如何影响比较——事实上,我很惊讶 .NET 默认以这种方式运行,这似乎违反直觉。
  • 看看我的编辑。我猜 .NET 也和 Collator 有一样的东西。
【解决方案2】:

这是由于 ASCII 字符集中的字符顺序造成的。如果您要在程序中进行任何形式的数据操作,那么您应该真正理解这一点。

我不确定网格控件是否有任何属性可以让您修改排序顺序,如果没有,您将不得不编写自己的排序子例程。

您可以将 std::sort 函数与用户定义的谓词函数一起使用,该函数将所有小写字母放在大写字母之前。

【讨论】:

    【解决方案3】:

    来自Java String

    返回: 如果参数字符串等于该字符串,则值为 0;如果此字符串按字典顺序小于字符串参数,则值小于 0;如果此字符串按字典顺序大于字符串参数,则值大于 0。

    来自.Net String.CompareTo

    此方法执行一个单词(区分大小写和区域性) 使用当前文化进行比较。有关单词的更多信息, 字符串和序数排序,请参阅System.Globalization.CompareOptions。

    这篇文章解释了difference between the comparison types

    以及所有比较类型之间的doc explains the difference;

    如果你看看这两个,CurrentCulture 和 Ordinal

     StringComparison.Ordinal: 
     LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131) 
     LATIN SMALL LETTER I (U+0069) is greater than LATIN CAPITAL LETTER I (U+0049) 
     LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U
    
     StringComparison.CurrentCulture: 
     LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131) 
     LATIN SMALL LETTER I (U+0069) is less than LATIN CAPITAL LETTER I (U+0049) 
     LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049) 
    

    Ordinal 是唯一一个 "i" > "I" 和 Java 类似

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-04
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多