字符串比较和字符的字母顺序

21

我有一个关于字符串比较与字符比较的问题。

字符>0(零)分别具有十进制值6248

当我在下面的代码中比较两个字符时,我得到了True的值(这是正确的)

Console.WriteLine('>' > '0');

在下面的代码中,当我比较两个单字符字符串时,我得到了值为-1的结果,这表明“>”小于“0”(默认文化是英语)。

Console.WriteLine(string.Compare(">", "0"));

以下代码中比较"3"和"1"(5149的编码值),返回1(符合预期)

Console.WriteLine(string.Compare("3", "1"));

另外,string.Compare(string str1, string str2) 的文档说明如下:

比较使用当前区域性进行,以获取特定于区域性的信息,例如大小写规则和单个字符的字母顺序

您能否解释一下(或提供一些文档参考),例如如何实现字符串比较,以及如何计算单个字符的字母顺序等?

4个回答

26

字符串的排序顺序取决于您使用的文化。

StringComparer.CurrentCulture 在我的计算机上按以下方式对以下1个字符的字符串进行排序:

' -   ! " # $ % & (  ) * , . / : ; ? @ [
\ ] ^ _ ` { | } ~ +  < = > 0 1 2 3 4 5 6
7 8 9 a A b B c C d  D e E f F g G h H i
I j J k K l L m M n  N o O p P q Q r R s
S t T u U v V w W x  X y Y z Z

StringComparer.Ordinal按以下方式对相同的字符串进行排序:

  ! " # $ % & ' ( )  * + , - . / 0 1 2 3
4 5 6 7 8 9 : ; < =  > ? @ A B C D E F G
H I J K L M N O P Q  R S T U V W X Y Z [
\ ] ^ _ ` a b c d e  f g h i j k l m n o
p q r s t u v w x y  z { | } ~

9
你没有告诉我们你当前使用的语言环境,这真是遗憾。我可以说它不是“fy-NL”(荷兰弗里西亚语),因为那样字母“y”会在字母“i”的旁边。同样,它也不可能是“et-EE”(爱沙尼亚语),因为这样字母“z”会在字母“s”的旁边。 - Jeppe Stig Nielsen

25

当您比较字符'>''0'时,您正在比较它们的序数值。

要从字符串比较中获得相同的行为,请提供序数字符串比较类型:

  Console.WriteLine(string.Compare(">", "0", StringComparison.Ordinal));
  Console.WriteLine(string.Compare(">", "0", StringComparison.InvariantCulture));
  Console.WriteLine(string.Compare(">", "0", StringComparison.CurrentCulture));

当前默认使用的是“当前文化”,其排序顺序旨在按字母顺序而非严格的词法顺序对字符串进行排序,这里的“按字母顺序”是指某种定义下的。


4

听起来你想要的是比较不使用特定文化规则。你尝试过使用StringComparison.Ordinal吗:

Console.WriteLine( string.Compare( ">", "0", StringComparison.Ordinal ) ); // returns a positive number

1

它返回-1,因为它比较的是str2str1,而不是反过来。例如,“48是否等于62”。不,它小于62,因此返回-1。当你阅读参数顺序时,语义上有点混乱。


MSDN说:“String.Compare(strA,strB) - 小于零 - strA小于strB。”例如,string.Compare("A", "B")返回-1 - "A"小于"B"。为什么">"小于"0" - dtb
我更新了我的问题:当你比较 "3" 和 "1"时,得到的值是 1,其中 "3" 的代码是51,而 "1" 的代码是49(如预期)。因此,这与您的解释不符。 - Alexandar
1
@Alexandar 很好的观点。我认为PeteKirkham回答得比我好。 - DiskJunky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接