2010-05-17 10 views
4

Je pense que je besoin d'un petit coup de pouce dans la bonne direction:Sur Joining TObjectlists

J'ai deux Tobjectlists du même type de données, et je veux concaténer ceux-ci dans une nouvelle liste dans laquelle list1 doit être copié (non modifié), suivi par liste2 (en sens inverse)

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; 

-t-delphi ont une fonction intégrée pour fusionner deux Tobjectlists en un seul?

Répondre

11

Utilisez TObjectList.AddRange() et réglez OwnsObjects sur False pour éviter la double libération des articles dans 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; 
+2

Notez que AddRange n'est disponible que sur la version générique de TObjectList, donc il n'existait pas en 2006 (et probablement en 2007). Ça devrait aller si vous utilisez une version récente. Sinon, vous devez créer cette boucle d'ajout. C'est assez simple ... –

+0

Eh bien, l'OP utilise un TObjectList générique dans son exemple, donc il devrait aller bien. –

+0

Merci, cela résout mes problèmes! – sum1stolemyname

0

Hélas, la réponse fournie semble que cela ne fonctionne que dans XE .. en 2010 (et probablement ci-dessous), la fonction AddRange n'a pas une surcharge qui prend un TObjectList comme paramètre (compilation l'extrait de code ci-dessus donne un E2250 sur les lignes AddRange).

Actuellement, passer une journée à travailler si les génériques aident à simplifier le code dans un grand projet, mais l'absence d'une fonction d'affectation (ou tout équivalent utilisable) est un point d'arrêt. Il semble étrange de publier quelque chose dans D2009, puis d'exiger deux versions majeures avant que cela ne fonctionne réellement!