2012-03-20 5 views
12

¿Hay un método simple o una forma fácil de copiar un contenido de TDictionary en otro? Digamos que tengo las siguientes declaraciones¿Hay una manera fácil de copiar el contenido de TDictionary en otro?

type 
    TItemKey = record 
    ItemID: Integer; 
    ItemType: Integer; 
    end; 
    TItemData = record 
    Name: string; 
    Surname: string; 
    end; 
    TItems = TDictionary<TItemKey, TItemData>; 

var 
    // the Source and Target have the same types 
    Source, Target: TItems; 
begin 
    // I can't find the way how to copy source to target 
end; 

y me gustaría copiar 1: 1 del origen al destino. ¿Hay tal método para esto?

Gracias!

Respuesta

21

TDictionary tiene un constructor que permite pasar en otro objeto de colección, lo que creará el nuevo copiando el contenido del original. ¿Es esto lo que estás buscando?

constructor Create(Collection: TEnumerable<TPair<TKey,TValue>>); overload; 

Así que usaría

Target := TItems.Create(Source); 

Y Blanco se crearía como una copia de la fuente (o al menos contiene todos los elementos de procedencia).

+3

+1 Uso TDictionary genérico bastante pero no lo sé. Gracias. – Justmade

+2

+1 de mí también, no sabía sobre esta sobrecarga, ¡estoy tan molesto ahora mismo! -.- – ComputerSaysNo

0

creo que esto debe hacer el truco:

var 
    LSource, LTarget: TItems; 
    LKey: TItemKey; 
begin 
    LSource := TItems.Create; 
    LTarget := TItems.Create; 
    try 
    for LKey in LSource.Keys do 
     LTarget.Add(LKey, LSource.Items[ LKey ]); 
    finally 
    LSource.Free; 
    LTarget.Free; 
    end; // tryf 
end; 
+0

Puede explicar por qué se asigna LNewKey : = LKey; en lugar de simplemente usar Lkey dos veces en la expresión LTarget.Add (LKey, LSource.Items [LKey]); – RobertFrank

+0

@Robert, sí, es un sobrante de alguna prueba, gracias, lo eliminaré ... – ComputerSaysNo

1

Si quiere ir aún más lejos, aquí hay otro enfoque:

type 
    TDictionaryHelpers<TKey, TValue> = class 
    public 
    class procedure CopyDictionary(ASource, ATarget: TDictionary<TKey,TValue>); 
    end; 

...implementation... 

{ TDictionaryHelpers<TKey, TValue> } 

class procedure TDictionaryHelpers<TKey, TValue>.CopyDictionary(ASource, 
    ATarget: TDictionary<TKey, TValue>); 
var 
    LKey: TKey; 
begin 
    for LKey in ASource.Keys do 
    ATarget.Add(LKey, ASource.Items[ LKey ]); 
end; 

uso de acuerdo con su definición de clave y Valor:

TDictionaryHelpers<TItemKey, TItemData>.CopyDictionary(LSource, LTarget); 
Cuestiones relacionadas