【发布时间】:2015-06-17 19:57:27
【问题描述】:
在 C# 4.0 中,每当我比较具有一个或多个尾部斜杠的两个字符串时,比较会给出不正确的结果:
String a = "1/2.1/";
String b = "1/2/";
if (a.CompareTo(b) > 0)
MessageBox.Show("Correct: " + a + " > " + b);
else
MessageBox.Show("Not correct: " + a + " <= " + b);
a = a.TrimEnd('/');
b = b.TrimEnd('/');
if (a.CompareTo(b) > 0)
MessageBox.Show("Trailing slash removed. Correct: " + a + " > " + b);
else
MessageBox.Show("Trailing slash removed. Not correct: " + a + " <= " + b);
从词法上讲,“1/2.1/”出现在“1/2/”之后,对此没有太多疑问。
这种行为也出现在其他地方,例如使用 Select 方法对数据表进行排序。
我做错了吗?或者这是.Net中的一个错误? 它甚至不应该与特定于文化的信息等有关,因为斜杠是最基本的美国 ASCII 字符集的一部分。
我在比较 SQL Server 层次 ID 时遇到了这个问题。这很容易解决,但这是一个有点令人惊讶的问题。
【问题讨论】:
-
.是 0x2e,/是 0x2f。.是第一位的。您的问题正是在您认为理所当然的假设中:“1/2.1/ 出现在 1/2/ 之后,对此没有太多疑问。”跨度> -
请注意,您正在使用文化敏感比较。很少有人了解 Unicode 比较规则。您会发现许多令人惊讶的行为。