2013-02-19 175 views
16

我有一个与字符串比较和字符比较相关的问题。字符串比较和单个字符的字母顺序

字符>0(零)相应地具有以下十进制值6248

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

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

当我在下面的代码比较两个单字符的字符串,我得到的值-1这表明“>” 小于 “0”(默认培养是英语)

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

而 “3” 和 “1”(5149代码VALU的比较ES)在下面的代码返回1(如预期)

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

此外,string.Compare(string str1, string str2)文档说:

比较使用当前培养以得到区域性特定 信息,诸如套管规则和的 单个字符的字母顺序

你能解释(或提供参考了一些文档)如何小号例如,实施比较。 个人字符的字母顺序是如何计算的?

回答

14

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

从字符串比较获得相同的行为,供应有序字符串比较类型:

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

当前的文化所使用的默认设置,其目的排序为字符串“字母”,而在排序严格词汇顺序,按字母顺序一些定义。

0

它返回-1,因为它正在比较str2str1,而不是反过来。例如,“48等于62”。不,它小于62,所以它返回-1。当您读取参数顺序时,语义上有点令人困惑

+0

[MSDN](http://msdn.microsoft.com/en-us/library/84787k22.aspx)显示“String.Compare(STRA,STRB) - 小于零 - STRA是少比strB。“例如,'string.Compare(“A”,“B”)'返回'-1' - '“A”'小于'“B”'。为什么'“>”'小于'“0”'? – dtb 2013-02-19 21:15:23

+0

我已经更新了我的问题:当您比较“3”到“1”时,您得到值“1”,其中“3”代码为51,“1”代码为49(如预期的那样)。所以这与你的解释不符。 – Alexandar 2013-02-19 21:18:59

+0

@Alexandar好点。我认为PeteKirkham回答比我更好 – DiskJunky 2013-02-19 21:26:18

17

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

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 { | } ~ 
+5

你没有告诉我们你目前的文化是什么,这是一个耻辱。我可以说它不是''fy-NL''(西弗里西亚语(荷兰)),因为那样'y'就会在'i'旁边。此外,它不能是“et-EE”(爱沙尼亚语(爱沙尼亚)),因为那么'z'会在's'旁边。 – 2013-10-02 08:46:29

+0

用户dtb根据SO配置文件位于德国。 – 2018-02-11 14:23:30

2

这听起来像你想要什么比较不使用特定于文化的规则。你有没有尝试过StringComparison。序:

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