CompareString (Win32) 和 String.Compare (.NET) 的默认行为似乎在很大程度上使其无用。但也许我错过了一些东西。考虑以下 .NET 示例:
namespace ConsoleApplication
{
class Program
{
static string CompareStrings(string str1, string str2)
{
int result = String.Compare(str1, str2);
if (result < 0)
return "<";
else if (result > 0)
return ">";
else
return "=";
}
static void Main(string[] args)
{
string s1 = "---dta-----";
string s2 = "DTA";
string s3 = "---DTA---";
Console.WriteLine("S1 {0} S2", CompareStrings(s1, s2));
Console.WriteLine("S2 {0} S3", CompareStrings(s2, s3));
Console.WriteLine("S3 {0} S1", CompareStrings(s3, s1));
Console.ReadKey();
}
}
}
哪个输出:
S1 < S2
S2 < S3
S3 < S1
这对于任何合理的排序算法显然是无用的,因为 S1 不能同时小于和大于 S3。
(注意。使用默认参数的 Win32 CompareString 函数可以演示完全相同的行为)
根据CompareString的文档:
“CompareString [...] 默认[s] 使用“单词排序”技术。对于这种类型的排序,所有标点符号和其他非字母数字字符(连字符和撇号除外)都位于任何字母数字字符之前。连字符和撇号与其他非字母数字字符的处理方式不同,以确保诸如“coop”和“co-op”之类的单词在排序列表中保持在一起。
这可能在某种程度上解释了为什么这个例子表现出这种奇怪的行为,以及为什么指定 SORT_STRINGSORT 标志(使用 CompareString)会产生“合理”的结果(在 .NET 中指定 StringComparison.InvariantCulture 也可以解决问题,尽管显然这并不完全相等的)。
我的问题是——谁能告诉我在什么情况下默认行为是可取的,或者它只是一个错误?