如何对键入的列表进行排序

发布于 2024-09-13 21:19:35 字数 772 浏览 18 评论 0原文

我有许多类型化的 TList,我在排序时遇到问题

通常,对于非类型化的 TList,我会有一个函数,例如:

function SortByJob(Item1: Pointer; Item2: Pointer): Integer;
var
  p1, p2: JobPointer;
begin
   p1 := JobPointer(Item1);
   p2 := JobPointer(Item2);
   if p1.job > p2.job then
      Result := 1
   else
      if p1.job = p2.job then
         Result := 0
      else
         Result := -1
end;

列表将调用该

JobList.Sort(SortByJob)

函数但是我已经决定在当前的应用程序中我们想要锁定TList 指向某些指针类型,因此在上面的示例中,我们将 JobList 声明为:

JobList: array[0..4] of TList<JobsPointer>;

现在,当我调用时,

JobList[0].Sort(SortByJob)

我收到“参数不足”错误。

有什么想法吗?

我比较过,如果我在无类型的“标准”TList 上使用上面的 Sort 函数,那么它将正确编译......

I have a number of Typed TLists which I am having problems getting to sort

Normally, for an untyped TList, I would have a function such as:

function SortByJob(Item1: Pointer; Item2: Pointer): Integer;
var
  p1, p2: JobPointer;
begin
   p1 := JobPointer(Item1);
   p2 := JobPointer(Item2);
   if p1.job > p2.job then
      Result := 1
   else
      if p1.job = p2.job then
         Result := 0
      else
         Result := -1
end;

Which would be called by the list

JobList.Sort(SortByJob)

However I have decided in my current application that we want to lock the TLists to certain pointer types, so in the above example we would have the JobList declared as:

JobList: array[0..4] of TList<JobsPointer>;

Now when I call

JobList[0].Sort(SortByJob)

I get a "not enough parameters" error.

Any ideas?

I have compared that if I use the Sort function above on an untyped "standard" TList then it will compile correctly...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如果没有 2024-09-20 21:19:35

通用列表使用 IComparer 实例进行排序。下面是一个对整数列表进行排序的示例:

uses Generics.Collections, Generics.Defaults;

procedure TForm1.FormCreate(Sender: TObject);
var
  L : TList<integer>;
begin
  L := TList<integer>.Create;
  L.Add(2);
  L.Add(1);

  L.Sort(TComparer<integer>.Construct(
    function (const L, R: integer): integer
    begin
      Result := L - R;
    end
  )) ;

  L.Free;
end;

A generic list is sorted using a instance of IComparer. Here is an example that sorts a list of integers:

uses Generics.Collections, Generics.Defaults;

procedure TForm1.FormCreate(Sender: TObject);
var
  L : TList<integer>;
begin
  L := TList<integer>.Create;
  L.Add(2);
  L.Add(1);

  L.Sort(TComparer<integer>.Construct(
    function (const L, R: integer): integer
    begin
      Result := L - R;
    end
  )) ;

  L.Free;
end;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文