5

我认为我需要朝着正确的方向轻推:

我有两个相同数据类型的 Tobjectlists,我想将它们连接到一个新列表中,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 合并为一个?

4

2 回答 2

12

使用TObjectList.AddRange()并设置OwnsObjectsFalse避免重复释放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;
于 2010-05-17T10:13:28.167 回答
0

唉,提供的答案看起来只适用于 XE .. 在 2010 年(大概在下面),AddRange 函数没有将 TObjectList 作为其参数的重载(编译上面的代码片段会在 AddRange 行上给出 E2250) .

如果泛型有助于简化大型项目中的代码,但目前缺少分配函数(或任何可用的等效函数),则目前花费一天的时间工作是一个障碍。在 D2009 中发布某些东西似乎很奇怪,然后需要 2 个主要版本才能真正起作用!

于 2010-12-15T10:11:59.773 回答