О присоединении к спискам TObjectlists - PullRequest
5 голосов
/ 17 мая 2010

Я думаю, что мне нужно подтолкнуть в правильном направлении:

У меня есть два 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 ]

12 голосов
/ 17 мая 2010

Используйте 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;
0 голосов
/ 15 декабря 2010

Увы, предоставленный ответ выглядит так, как будто он работает только в XE .. В 2010 году (и, вероятно, ниже) функция AddRange не имеет перегрузки, которая принимает TObjectList в качестве своего параметра (компиляция приведенного выше фрагмента кода дает E2250 на Строки AddRange).

В настоящее время тратит день на работу, если дженерики помогут упростить код в большом проекте, но отсутствие функции присваивания (или любого другого полезного эквивалента) является показательным моментом. Кажется странным выпустить что-то в D2009, а затем потребовать 2 основных релиза, прежде чем оно действительно заработает!

...