关于加入 TObjectlists

发布于 2024-09-01 23:55:01 字数 549 浏览 4 评论 0原文

我想我需要朝正确的方向轻推:

我有两个相同数据类型的Tobjectlist,我想将它们连接到一个新列表中,其中list1将被复制(未修改),然后是list2(相反)

type
  TMyListType = TobjectList<MyClass>

var
  list1, list2, resList : TMyListtype

begin
  FillListWithObjects(list1);
  FillListWithOtherObjects(list2);

  list2.reverse

  //Now, I tried to use resList.Assign(list1, list2, laOr), 
  //but Tobjectlist has no Assign-Method. I would rather not want to 
  //iterate over all objects in my lists to fill the resList
end;

delphi是否有任何将两个 Tobjectlist 合并为一个的内置函数?

I think i need a nudge in the right direction:

I have two Tobjectlists of the same datatype, and i want to concatenate these into a new list into which list1 shall be copied (unmodified) followed by list2 (in reverse)

type
  TMyListType = TobjectList<MyClass>

var
  list1, list2, resList : TMyListtype

begin
  FillListWithObjects(list1);
  FillListWithOtherObjects(list2);

  list2.reverse

  //Now, I tried to use resList.Assign(list1, list2, laOr), 
  //but Tobjectlist has no Assign-Method. I would rather not want to 
  //iterate over all objects in my lists to fill the resList
end;

Does delphi have any built-in function to merge two Tobjectlists into one?

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

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

发布评论

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

评论(2

东走西顾 2024-09-08 23:55:01

使用 TObjectList.AddRange() 并将 OwnsObjects 设置为 False 以避免双重释放 LRes 中的项目。

var
  L1, L2, LRes: TObjectList<TPerson>;
  Item: TPerson;

{...}

L1 := TObjectList<TPerson>.Create();
try
  L2 := TObjectList<TPerson>.Create();
  try

    LRes := TObjectList<TPerson>.Create();
    try
      L1.Add(TPerson.Create('aa', 'AA'));
      L1.Add(TPerson.Create('bb', 'BB'));

      L2.Add(TPerson.Create('xx', 'XX'));
      L2.Add(TPerson.Create('yy', 'YY'));

      L2.Reverse;

      LRes.OwnsObjects := False;
      LRes.AddRange(L1);
      LRes.AddRange(L2);

      for Item in LRes do
      begin
        OutputWriteLine(Item.FirstName + ' ' + Item.LastName);
      end;

    finally
      LRes.Free;
    end;

  finally
    L2.Free;
  end;

finally
  L1.Free;
end;

Use TObjectList.AddRange() and set OwnsObjects to False to avoid double-freeing of the items in LRes.

var
  L1, L2, LRes: TObjectList<TPerson>;
  Item: TPerson;

{...}

L1 := TObjectList<TPerson>.Create();
try
  L2 := TObjectList<TPerson>.Create();
  try

    LRes := TObjectList<TPerson>.Create();
    try
      L1.Add(TPerson.Create('aa', 'AA'));
      L1.Add(TPerson.Create('bb', 'BB'));

      L2.Add(TPerson.Create('xx', 'XX'));
      L2.Add(TPerson.Create('yy', 'YY'));

      L2.Reverse;

      LRes.OwnsObjects := False;
      LRes.AddRange(L1);
      LRes.AddRange(L2);

      for Item in LRes do
      begin
        OutputWriteLine(Item.FirstName + ' ' + Item.LastName);
      end;

    finally
      LRes.Free;
    end;

  finally
    L2.Free;
  end;

finally
  L1.Free;
end;
∞觅青森が 2024-09-08 23:55:01

唉,提供的答案看起来只在 XE 中有效。在 2010 年(大概在下面),AddRange 函数没有以 TObjectList 作为参数的重载(编译上面的代码片段在 AddRange 行上给出了 E2250) 。

目前花了一天时间研究泛型是否有助于简化大型项目中的代码,但缺乏分配函数(或任何可用的等效函数)是一个令人震惊的问题。在 D2009 中发布一些东西然后需要 2 个主要版本才能真正发挥作用似乎很奇怪!

Alas, the answer supplied looks like it only works in XE.. in 2010 (and presumably below) the AddRange function does not have an overload that takes a TObjectList as its parameter (compiling the above code snippet gives an E2250 on the AddRange lines).

Currently spending a day working if generics will help simplify code in a large project but the lack of an assign function (or any usable equivalent) is a showstopper. Seems odd to release something in D2009 then require 2 major releases before it actually works!

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