5

私は正しい方向に微調整する必要があると思います:

同じデータ型の 2 つの 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 には、2 つの Tobjectlist を 1 つにマージする組み込み関数がありますか?

4

2 に答える 2

12

内の項目の二重解放を回避するには、 と を使用TObjectList.AddRange()して設定OwnsObjectsします。FalseLRes

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 が返されます)。 .

現在、大規模なプロジェクトでジェネリックがコードを簡素化するのに役立つかどうかを調べるのに 1 日を費やしていますが、代入関数 (または使用可能な同等のもの) がないことが大きな問題です。D2009 で何かをリリースし、実際に機能する前に 2 つのメジャー リリースが必要になるのは奇妙に思えます!

于 2010-12-15T10:11:59.773 に答える