字符串比较函数string.Compare是否会对于不相等的字符串返回0呢?

3

我在思考C#中string.Compare()方法的数学原理。

两个不相等的字符串是否可能在此方法调用时返回0?

我指的是真正不相等的字符串,如"Herp"和"Derp",而不是"Herp"和"Hěrp"。

不幸的是,除了基本的空值情况外,string.Compare源代码都是.NET之外的内部内容。

我认为这里是实际使用的C++代码,但很难确定。

我正在考虑以下情况:

  • 奇怪的顺序行为(只是导致相等的字符串排列组合)
  • 溢出整数,导致比较结果为正数和负数,从而得到0
  • 其他任何一个比我更熟悉mscorlib实现的人能想到的疯狂情况

我提出这个问题没有特定的原因 - 只是出于好奇。而且我以前没有看到过有人在C#中问这个问题!


@GrantWinney 深入探究 - CLR 代码只处理空值情况。如果要真正比较字符串,则需要使用 C++ 代码。 - Codeman
注意,.NET 4.0中引入了一个字符串比较错误,会破坏传递性反对称性质,从而破坏排序顺序。我不确定它是否已经修复。如果您想阅读一个长篇睡前故事:D,请参考https://dev59.com/CmYr5IYBdhLWcg3w8-zA?lq=1或者这个让我来到SO的问题:https://dev59.com/CXTYa4cB1Zd3GeqPtlvN - Alex
我明白了。基本上,“CLR中的字符串比较代码是否有已知的错误” - 我猜答案可能是否定的,但你需要CLR团队的人来回答。 - Alexei Levenkov
这取决于你对不相等的定义,但是有一个例子:String.Compare("ss", "ß", false, CultureInfo.InvariantCulture) == 0 - Guffa
如果您正在调用执行序数比较的变量,则可以在此处找到代码(http://referencesource.microsoft.com/#mscorlib/system/string.cs,8711fff131bc4d0e)(这是始终有效的逐字节比较)。请注意,对于“null”值和第一个字符不同的快速检查,[string.Compare](http://referencesource.microsoft.com/#mscorlib/system/string.cs,0be9474bc8e160b6)的主要调用进行处理。 - Guvante
1个回答

4
我相信你问题的答案在技术上是“是”,取决于你调用哪个重载方法以及传递了哪些可选参数。根据MSDN文档,可以使用具有奇怪字符序数值规则或甚至跳过某些字符的区域设置进行比较:

调用者注意事项

字符集包括可忽略字符。当Compare(String, String)方法执行区域设置比较时,不考虑这些字符。例如,如果在.NET Framework 4或更高版本上运行以下代码,则使用软连字(或U+00AD)对“animal”与“ani-mal”进行区域设置比较表明这两个字符串是等效的。

如果您想忽略文化差异,只比较两个字符串的原始值,可以调用重载String.Compare(s1, s2, StringComparison.OrdinalIgnoreCase)。这应该基本上是一个逐字节的比较。文档:
“调用者注意事项”...为了识别比较中可忽略的字符,请为comparisonType参数提供StringComparison.Ordinal或OrdinalIgnoreCase的值。
请注意,“更大”或“更小”的字符串的定义并不一定明显。例如,字符串“abc”比“abcc”大还是小? .NET非常清楚,在字符串比较的目的下它是较小的。但在依赖这些边缘情况之前,仔细阅读文档是很好的选择:
“比较在发现不等式或两个字符串已经比较时终止。然而,如果两个字符串在一个字符串的末尾相等,并且另一个字符串还有剩余的字符,则具有剩余字符的字符串被认为是更大的。返回值是执行的最后一个比较的结果。”

我指的不是文化,而是真正不相等的字符串,比如“Herp”和“Derp”,而不是“Herp”和“Hěrp”。 - Codeman
@Pheonixblade9:不,这些字符串应该始终不同。因为比较是按字典顺序比较的。如果两个字符串中有两个字符不同,那么这两个字符串也就不同了。关键在于字符可以有一定的模糊性,同时也可以是相等的字符。 - Willem Van Onsem
@CommuSoft,我不是在问简单的情况,我在问疯狂的边缘情况。我知道短字符串会正确工作 :) - Codeman
@JordanRieger,你的回答并不是错误的,但很遗憾,它并不是我正在寻找的。 - Codeman
@Pheonixblade9 好的,我已经扩展了它。就像其他评论者所说的,这主要取决于您对“相等”和“不相等”的语义理解。(当然,框架中的错误也会影响它,但我认为这超出了问题的范围。) - Jordan Rieger
显示剩余4条评论

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