2009-10-03 127 views
2

我有一個自定義排序TStringList ......爲什麼我的TStringList沒有排序?

Items.CustomSort(@CompareWords); 

......與此對比功能:

function CompareWords(List: TStringList; Index1, Index2: Integer): Integer; 
begin 
    Result := StrIComp(PWideChar(List[Index1]), PWideChar(List[Index2])); 
end; 

但注意到一些問題,我的代碼,它需要將列表中進行排序後,訂單StrIComp誘導,我創建了這個小檢查...

for i := 1 to Items.Count - 1 do 
begin 
    Assert(StrIComp(PWideChar(Items[i-1]), PWideChar(Items[i])) <= 0); 
end; 

...並且它失敗。

爲什麼列表不正確排序?

+1

1.您使用的是哪個Delphi版本? (IOW:項目[I]到PWideChar的有效嗎?) 2.爲什麼使用StrIComp而不是簡單的CompareText? 3.是否調用Sort OK的結果? – 2009-10-03 11:04:22

+0

是的,演員表是正確的。我使用字符串列表來準備一個二進制文件,後來使用StrLIComp進行二進制搜索。我感覺更好,當兩個部分使用相同的比較方法。 – 2009-10-03 11:37:19

+1

當您調用'CustomSort'時,不要在函數前使用'@'。它可以掩蓋比較函數聲明中的錯誤。 (不過,在這種情況下,你沒問題。)另外,請輸入到'PChar',而不是'PWideChar'。僅僅因爲它們對你而言是同一類型的,並不意味着它們將永遠屬於同一類型。 'TStringList'包含通用字符串,因此將其類型轉換爲通用'PChar'。 (即使*你*從未使用過不同的Delphi版本,其他來這裏複製和粘貼代碼的人可能會這樣,所以最好不要在不需要時使用版本敏感的代碼。) – 2009-10-03 17:33:23

回答

3

您可能有Items.Sorted = True。

+0

你釘了它:) Items.Sorted是真實的,顯然導致一些奇怪的行爲。我還更新了我的問題,以消除您指出的代碼錯誤。你可以請你重申一下你的答案,指向Sorted屬性?然後我會接受它。 – 2009-10-03 10:56:56

相關問題