【问题标题】:Delphi XE2 Sort Tstringlist by FilenameDelphi XE2 按文件名排序 Tstringlist
【发布时间】:2016-11-16 01:01:07
【问题描述】:

我有一系列文件,其中包含各种文件路径和文件名,所有文件名都具有相同的扩展名,但目录名或路径都不同,并且已着手将文件加载到 Tstringlist 中,我正在尝试将它们按文件名顺序排序,即使它们也有路径。

下面是 Tstringlist 中的字符串示例:-

c:\directory 1\AboutUs.lnk
c:\directory something\AAHelp.lnk
c:\directory anything\AAATalk.lnk

当按我想要结束的字符串的文件名部分排序时。

c:\directory anything\AAATalk.lnk
c:\directory something\AAHelp.lnk
c:\directory 1\AboutUs.lnk

换句话说,我希望能够通过字符串的文件名部分对带有路径的字符串进行排序。

任何帮助将不胜感激!

【问题讨论】:

    标签: sorting delphi


    【解决方案1】:

    使用TStringList.CustomSort():

    function Compare(List: TStringList; Index1, Index2: Integer): Integer;
    begin
      Result := CompareStr(
        LowerCase(ExtractFileName(List[Index1])),
        LowerCase(ExtractFileName(List[Index2]))
      );
    end;
    
    // Then, just call:
    YourStrList.CustomSort(Compare);
    

    【讨论】:

    • 这种方法可行,但性能可能很差。为什么?因为在这种方法中,每次比较都会调用ExtractFileName 两次。现在需要多少比较很大程度上取决于使用哪种排序算法。所以我建议在进行任何排序之前准备数据(提取文件名)。这可以显着加快流程,因为您只需为每个列表项调用一次ExtractFileName
    • 或许更好的方法是准备您的数据,以便将其存储为一对字符串,其中一个字符串代表文件路径,另一个代表文件名。这也将允许您实现所谓的multi-parameter 排序,您最初将根据文件名对数据进行排序,当您有多个同名文件时,您将进一步按它们的路径对它们进行排序。
    • @SilverWarior,我理解您关于优化的观点。您可以发布一个实现您的想法的答案,我很乐意建议更改已接受的答案。
    • @MichaelGeraghty,我很高兴能做出贡献。我认为这就是社区的目的。祝你回来的路上好运。
    • 这里不要使用小写。 CompareText 函数执行不区分大小写的比较。或 AnsiCompareText 用于区分区域设置的不区分大小写的比较。
    猜你喜欢
    • 2012-12-05
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多