11

在 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 方法(字符串)

4

3 回答 3

3

我能找到的文档说:

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

因此,正如您所说,它与默认情况下使用 Unicode 代码点进行字典比较的Java.compareTo()并不完全相同。

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

看来,如果您想在 .NET 中进行字符串比较“à la Java”,则必须String.CompareOrdinal()改用。

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

最后, MSDN 上的另一个链接显示了文化对比较甚至字符串相等性的影响。

于 2013-06-28T06:34:26.270 回答
2

来自Java 字符串

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

来自.Net String.CompareTo

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

这篇文章解释了比较类型之间的区别

文档解释了所有比较类型之间的区别;

如果你看看这两个,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 喜欢

于 2013-06-28T06:36:55.893 回答
-1

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

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

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

于 2013-06-28T06:36:45.187 回答