2

DelphiXE2で文字列リストを並べ替えるのに問題があります。次に例を示します。

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、デフォルトのソート関数を使用して呼び出すだけです。これは、リストの状態(ソート済みまたは未ソート)を示すものではありません。リストが内部ソートアルゴリズムを使用してソートされ、新しいアイテムが最後ではなく適切な場所に追加されるかどうかを判断するだけです。ドキュメントから:

リスト内の文字列を自動的にソートするかどうかを指定します。

[並べ替え]をtrueに設定すると、リスト内の文字列が自動的に昇順で並べ替えられます。文字列が挿入された場所に残るようにするには、Sortedをfalseに設定します。Sortedがfalseの場合、Sortメソッドを呼び出すことにより、リスト内の文字列をいつでも昇順で並べ替えることができます。

Sortedがtrueの場合、Insertを使用してリストに文字列を追加しないでください。代わりに、[追加]を使用して、新しい文字列を適切な位置に挿入します。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 に答える