2012-03-20 13 views
12

Czy istnieje jedna metoda lub prosty sposób kopiowania treści TDictionary do innej? Powiedzmy mam następujące deklaracjeCzy istnieje prosty sposób na skopiowanie treści TDictionary do innej?

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; 

i chciałbym skopiować 1: 1 źródła do celu. Czy istnieje taka metoda?

Dzięki!

Odpowiedz

21

TDictionary ma konstruktora, który pozwala przechodzić w innym obiekcie kolekcji, która stworzy nowy, kopiując zawartość oryginału. Czy tego właśnie szukasz?

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

Więc byłoby użyć

Target := TItems.Create(Source); 

i cel będzie tworzony jako kopia Źródło (lub przynajmniej zawierać wszystkie elementy w źródło).

+3

+1 Używam Generic TDictionary sporo, ale nie znam tego. Dzięki. – Justmade

+2

+1 ode mnie również, nie wiedziałem o tym przeciążeniu, jestem teraz tak wkurzony! -.- – ComputerSaysNo

0

myślę, że to powinno wystarczyć:

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

Czy możesz wyjaśnić, dlaczego przypisać LNewKey : = LKey; zamiast używać Lkey dwukrotnie w wyrażeniu LTarget.Add (LKey, LSource.Items [LKey]); – RobertFrank

+0

@Robert, tak, to jest zostawione po jakimś teście, dziękuję, usunę to ... – ComputerSaysNo

1

Jeśli chcesz iść jeszcze dalej, tu jest inne podejście:

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; 

Wykorzystanie w zależności od definicji Key i Wartość:

TDictionaryHelpers<TItemKey, TItemData>.CopyDictionary(LSource, LTarget); 
Powiązane problemy