Delphi XE2不会将字符串列表标记为已排序

时间:2012-09-05 11:05:28

标签: delphi delphi-xe2

我在Delphi XE2中排序字符串列表时遇到问题。这是一个例子:

procedure AddText();
var
  StrList:  TStringList;
begin
  StrList := TStringList.Create();
  StrList.Add('Test1');
  StrList.Sort();
  WriteLn('Sorted: ' + BoolToStr(StrList.Sorted, true)); // Prints "Sorted: false"
  StrList.Add('Test2');
  StrList.Sort();
  WriteLn('Sorted: ' + BoolToStr(StrList.Sorted, true)); // Prints "Sorted: false"
  StrList.Add('Test3');
  StrList.Free();
end;

据我所知,问题是由于TStringList.Sorted永远不会设置为true(既不直接也不使用SetSorted)。它只是我还是一个bug?

1 个答案:

答案 0 :(得分:6)

Classes TStringList.Sort单元中没有任何内容可以让您期望它更改属性。 TStringList.Sort方法只使用默认排序函数调用CustomSort。它不是列表状态的指示符(已排序或未排序);它只是确定是否使用内部排序算法对列表进行排序,并将新项目添加到正确的位置而不是结尾。来自documentation

  

指定是否应自动对列表中的字符串进行排序。

     

将Sorted设置为true可使列表中的字符串按升序自动排序。将Sorted设置为false以允许字符串保留在插入位置。当Sorted为false时,可以通过调用Sort方法随时按升序放置列表中的字符串。

     

当Sorted为true时,请勿使用Insert将字符串添加到列表中。相反,使用Add,它会将新字符串插入适当的位置。当Sorted为false时,使用Insert将字符串添加到列表中的任意位置,或使用Add将字符串添加到列表末尾

但是,你首先使用它是错误的。只需将所有字符串添加到StringList,然后设置Sorted := True;即可。它将正确设置属性值并自动为您调用内部Sort方法。

procedure AddText();
var
  StrList:  TStringList;
begin
  StrList := TStringList.Create();
  StrList.Add('Test1');
  StrList.Add('Test2');
  StrList.Add('Test3');
  StrList.Sorted := True;
  // Do whatever
  StrList.Free;
end;

(您特别不希望在添加每个项目后调用Sort();这非常缓慢且效率低下。)