2016-11-16 45 views
5

我有一系列文件,其中有各種文件路徑和文件名,所有文件名具有相同的擴展名,但目錄名或路徑都不同,並且已經設置了將文件加載到Tstringlist,我試圖按照文件名順序排列它們,儘管它們也有路徑。Delphi XE2按文件名排序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 

換句話說,我希望能夠通過字符串的文件名部分對字符串進行排序。

任何幫助,將不勝感激!

回答

6

使用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); 
+1

這種方法將工作,但它可能有性能相當差。爲什麼?因爲在這種方法中,每次比較都要調用兩次「ExtractFileName」。現在需要多少次比較很大程度上取決於使用哪種排序算法。所以我建議在做任何分類之前準備數據(提取文件名)。這可以顯着加快處理速度,因爲您需要爲每個列表項調用「ExtractFileName」一次。 – SilverWarior

+1

或者更好的方法是準備數據,以便將其存儲爲一對字符串,其中一個字符串表示文件路徑,另一個表示文件名。這也可以讓你實現所謂的「多參數」排序,最初根據文件名對數據進行排序,當你有多個具有相同名稱的文件時,你可以按照它們的路徑進行排序。 – SilverWarior

+0

@SilverWarior,我理解你關於優化的觀點。你可以發佈一個答案來實現你的想法,我很樂意建議改變接受的答案。 – karliwson