2009-10-03 89 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

相关问题