0

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 也可以解决问题,尽管显然这并不完全相等的)。

我的问题是——谁能告诉我在什么情况下默认行为是可取的,或者它只是一个错误?

4

0 回答 0