2

我在 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)。它只是我还是它是一个错误?

4

1 回答 1

6

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

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

将 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()在添加每个项目后调用;这非常缓慢且效率低下。)

于 2012-09-05T12:57:07.397 回答