首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi TStringList CustomSort on Name

Delphi TStringList CustomSort on Name
EN

Stack Overflow用户
提问于 2014-02-04 23:41:15
回答 2查看 1.4K关注 0票数 0

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

我给你看一个小例子:

代码语言:javascript
复制
    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;

排序结果如下:

代码语言:javascript
复制
INFOS_NEGOCE=NOM_REPERTOIRE_ENT

INFOS_NEGOCE=NOM_CONTACT

INFOS_NEGOCE=NUM_CDE

INFOS_NEGOCE=DATE_CDE

我认为排序不会改变行的顺序(名称始终是INFOF_NEGOCE)。

EN

回答 2

Stack Overflow用户

发布于 2014-02-04 23:50:04

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

请参阅Quicksort - Repeated Elements

票数 2
EN

Stack Overflow用户

发布于 2014-02-05 00:03:00

代码语言:javascript
复制
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;

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

正如乌维·拉贝所观察到的那样,“原始顺序”不会起作用。

但并不是所有的东西都丢失了。通常,不使用包含在Tstringlist列表中的对象。如果它可用,那么就在排序之前,尝试

代码语言:javascript
复制
for i := 0 to pred(List.Count) do List.Objects[i] := TObject(i);

排序就变成了

代码语言:javascript
复制
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;

但是,如果让我们知道“正确”的顺序应该是什么,事情会容易得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21556771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档