我想我需要朝着正确的方向努力:
我有两个相同数据类型的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是否有任何内置函数将两个Tobjectlists合并为一个?
答案 0 :(得分:12)
使用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;
答案 1 :(得分:0)
唉,所提供的答案看起来只适用于XE ..在2010年(可能在下面),AddRange函数没有一个以TObjectList作为参数的重载(编译上面的代码片段给出了E2250) AddRange lines)。
目前,如果泛型有助于简化大型项目中的代码,但缺少分配函数(或任何可用的等效函数)是一个显而易见的工作,那么现在花一天时间工作。似乎奇怪的是在D2009中发布了一些内容,然后在实际工作之前需要2个主要版本!