名称上的Delphi TStringList CustomSort

时间:2014-02-04 15:41:15

标签: delphi sorting tstringlist

我尝试在Name部分对TStringList进行排序。为此,我使用customSort方法。

我给你举了一个例子:

    function CompareString(List : TStringList; Index1, Index2 : integer) : integer;
    begin
        result := AnsiCompareText(List.Names[Index1], List.Names[Index2]);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        Memo2.Clear;
        Liste.CustomSort(CompareString);     
        Memo2.Lines.Append(Liste.GetText)
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
        Liste := TStringList.Create;
        Liste.Append('INFOS_NEGOCE=NUM_CDE');
        Liste.Append('INFOS_NEGOCE=DATE_CDE');
        Liste.Append('INFOS_NEGOCE=NOM_REPERTOIRE_ENT');
        Liste.Append('INFOS_NEGOCE=NOM_CONTACT');     
        Memo1.Lines.Clear;
        Memo1.Lines.Append(Liste.GetText)
    end;

排序给我这个结果:

INFOS_NEGOCE=NOM_REPERTOIRE_ENT

INFOS_NEGOCE=NOM_CONTACT

INFOS_NEGOCE=NUM_CDE

INFOS_NEGOCE=DATE_CDE

我认为排序不要改变行的顺序(名称总是INFOF_NEGOCE)。

2 个答案:

答案 0 :(得分:2)

使用QuickSort完成排序。这意味着相同项目的顺序(如排序所示)未定义。

请参阅Quicksort - Repeated Elements

答案 1 :(得分:2)

function CompareString(List : TStringList; Index1, Index2 : integer) : integer;
begin
  Result := AnsiCompareText(List.Names[Index1], List.Names[Index2]);
  // If you want to sort equal strings then on the Values
  if Result = 0 then Result := AnsiCompareText(List.ValueFromIndex[Index1], List.ValueFromIndex[Index2]);
  // Or if you want to keep the original order
  { if Result = 0 then Result := Index1-Index2; --- qv : this won't work!}
end;
如果Result相等,则

0会被您的代码设置为Names。如果它们相等,请选择要用于对具有相同名称的项目进行排序的其他条件。


正如Uwe Raabe正确观察到的那样,“原始秩序”将不起作用。

但并非一切都没有丢失。通常,不使用Tstringlist中包含的对象。如果它可用,那么在排序之前,尝试

for i := 0 to pred(List.Count) do List.Objects[i] := TObject(i);

,排序变为

function CompareString(List : TStringList; Index1, Index2 : integer) : integer;
begin
  Result := AnsiCompareText(List.Names[Index1], List.Names[Index2]);
  // If you want to sort equal strings then on the Values
  if Result = 0 then Result := AnsiCompareText(List.ValueFromIndex[Index1], List.ValueFromIndex[Index2]);
  // Or if you want to keep the original order
  if Result = 0 then Result := integer(List.Objects[Index1])-integer(List.Objects[Index2]);
end;

但如果我们了解预期“正确”订单的秘密,那将会容易得多。