Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASCII比较和字符串比较之间的区别_C#_String Comparison - Fatal编程技术网

C# ASCII比较和字符串比较之间的区别

C# ASCII比较和字符串比较之间的区别,c#,string-comparison,C#,String Comparison,我用的是C#。当我比较两个字符值时,它会向我发送正确的输出,比如 '-'.CompareTo('!') //Its sending me positive value 12 表示'-'>'!'是真的 但当我比较两个相同值的字符串时,它会给我不同的结果 "-".CompareTo("!") //Its sending me negative value -1 表示“-”>“!”为假 有谁能解释一下它为什么这样做?这两种情况是否都应为“真”此比较“-”。CompareTo(“!”)将执行顺序比较

我用的是C#。当我比较两个字符值时,它会向我发送正确的输出,比如

'-'.CompareTo('!') //Its sending me positive value 12
表示'-'>'!'真的

但当我比较两个相同值的字符串时,它会给我不同的结果

"-".CompareTo("!") //Its sending me negative value -1
表示“-”>“!”


有谁能解释一下它为什么这样做?这两种情况是否都应为“真”

此比较
“-”。CompareTo(“!”)
将执行顺序比较。它将比较数字UTF-16编码值(
45
33

字符串比较
“-”。CompareTo(!”
不同,它将执行一个区域性感知比较。这意味着,无论数值是多少,字符都将根据当前区域性的排序规则进行排序

您可以尝试对字符串使用顺序比较:

String.CompareOrdinal("-", "!")
这将对字符串执行顺序比较,然后得到相同的结果(
12

您无法对
字符
(如果需要,只需将其转换为
字符串
)执行(真正的)区域性感知比较,因为排序顺序可能会受到比较前后字符的影响,单个字符可能不是一个图形(并且排序可能不适用)。举个例子:在捷克语中,C排在H之前,然后你期望H。CompareTo(“H”)=-1…错了,“ch”是一个有向图,它在H和I之间,然后
“ch”。CompareTo(“H”)==1
!!!更多关于这个的

顺序比较之所以不同,仅仅是因为它继承了ASCII(我尝试过的每个文化都返回相同的排序结果)。它们保留了ASCII顺序以实现兼容性(并更容易迁移到Unicode),但对于字符串比较,它们必须遵守区域性规则

更常见的例子是大写/小写字符(注意“和”以执行顺序和区域性比较):


如果您这样做是为了执行文本搜索,那么我强烈建议您不要直接使用
Char
comparison
,除非您知道区域性问题(排序)和Unicode详细信息(代理项和编码,主要)

var v = '-'.CompareTo('!');//12
var s = string.CompareOrdinal("-", "!");//12

这是由于
Char
String
类中的
IComparable
方法
CompareTo
的实现不同造成的

Char.cs

String.cs


其中,逻辑是依赖于内部
内部比较的区域性感知比较。比较用于排序,而非(必要)检查相等。实例被视为“相等”“如果
CompareTo
返回零。有关更多信息,请参阅和。发件人:此方法执行的比较基于此实例和值的编码值,而不是它们的字典特征。@Corak-我正在实现字符串的二进制搜索方法。所以我需要一个排序数组。那么,您认为我应该使用CompareTo()或我自己的比较方法吗?@Arnab在进行自定义字符串比较时要小心,除非您真正了解不同区域性之间的差异(或者您使用的是单个区域性)。角色比较(如你所见)很容易误导人。。。在任何情况下,在比较
字符串时,您可能不需要
char
逻辑。问题是您希望如何对它们进行排序。它应该是文化意识的,还是文化独立的,还是词典独立的?
String.CompareTo
String.CompareToOrdinal
是否按您想要的排序?然后使用这些,否则建立自己的排序逻辑您可能还想看看,我正在实现一个字符串的二进制搜索方法。所以我需要一个排序数组。那么您认为使用CompareTo()会有什么问题吗?或者我应该使用CompareOrdinal吗?这取决于您的结果需要如何,如果您需要依赖于区域性的比较,请使用
CompareTo
,还有其他可比较的选项,它们是
InvariantCulture
,并忽略它们的大小写变体。请参考我提供的链接,选择最合适的。
var v = '-'.CompareTo('!');//12
var s = string.CompareOrdinal("-", "!");//12
public int CompareTo(Char value) {
      return (m_value-value);
}
public int CompareTo(String strB) {
    return CultureInfo.CurrentCulture.CompareInfo.Compare(this, strB, 0);
}