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[...]default [s]は、「ワードソート」手法を使用します。このタイプのソートでは、ハイフンとアポストロフィを除くすべての句読点とその他の英数字以外の文字は、英数字の前に配置されます。ハイフンとアポストロフィは、他の英数字以外の文字とは異なる方法で処理され、「coop」や「co-op」などの単語が並べ替えられたリストに一緒に表示されるようにします。
これはおそらく、この例がこの奇妙な動作を示している理由と、(CompareStringを使用して)SORT_STRINGSORTフラグを指定すると「賢明な」結果が生成される理由を説明するのに役立ちます(.NETではStringComparison.InvariantCultureを指定すると、問題が修正されますが、これは完全ではありません同等)。
私の質問はこれです-デフォルトの動作が望ましい状況を誰かに教えてもらえますか、それとも単なるバグですか?