О присоединении к списку объектов
Я думаю, что мне нужно подтолкнуть в правильном направлении:
У меня есть два 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 в один?
2 ответа
Использование 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;
Увы, предоставленный ответ выглядит так, как будто он работает только в XE.. в 2010 году (и предположительно ниже) функция AddRange не имеет перегрузки, которая принимает TObjectList в качестве своего параметра (компиляция приведенного выше фрагмента кода дает E2250 в строках AddRange),
В настоящее время тратят день на работу, если дженерики помогут упростить код в большом проекте, но отсутствие функции присваивания (или любого другого полезного эквивалента) является показательным моментом. Кажется странным выпустить что-то в D2009, а затем потребовать 2 основных релиза, прежде чем это действительно заработает!