综述:
对于操作系统中的行为:
要在Delphi中编程,请使用StrCmpLogicalW Windows API进行自然sorting。
==========================
下面的文件名将在Windows资源pipe理器中进行sorting,如下所示:
test_1_test.txt
test_2_test.txt
test_11_test.txt
test_12_test.txt
test_21_test.txt
test_22_test.txt
例如,如果我把它们放在一个TStringList实例中并调用Sort,sorting的顺序如下:
test_1_test.txt
test_11_test.txt
test_12_test.txt
test_2_test.txt
test_21_test.txt
test_22_test.txt
并且为了logging,上面的文件名将在Cygwin的rxvtterminal或Linux CentOS的xtermterminal(如CentOS)中订购,如下所示:
test_11_test.txt
test_12_test.txt
test_1_test.txt
test_21_test.txt
test_22_test.txt
test_2_test.txt
你能帮忙评论一下如何理解这种sorting行为的差异吗? 此外,是否有可能获得与Windows资源pipe理器相同的顺序? 任何build议表示赞赏!
PS:我的Windows语言环境设置为中文,但我认为英文语言环境也是如此。
StrCmpLogicalW能够处理数字,另一种选择是CompareString
感谢安德斯 – 答案是StrCmpLogicalW; 我还没有发现它在Delphi 2009源代码中的声明,所以我在下面的测试中自己声明:
type TMyStringList = class(TStringList) protected function CompareStrings(const S1, S2: string): Integer; override; end; function StrCmpLogicalW(P1, P2: PWideChar): Integer; stdcall; external 'Shlwapi.dll'; function TMyStringList.CompareStrings(const S1, S2: string): Integer; begin Result:= StrCmpLogicalW(PChar(S1), PChar(S2)); end; procedure TForm11.Button2Click(Sender: TObject); var SL: TMyStringList; begin SL:= TMyStringList.Create; try SL.Add('test_1_test.txt'); SL.Add('test_11_test.txt'); SL.Add('test_12_test.txt'); SL.Add('test_2_test.txt'); SL.Add('test_21_test.txt'); SL.Add('test_22_test.txt'); SL.Sort; Memo1.Lines:= SL; finally SL.Free; end; end;