Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Assign für TDictionary implementieren (https://www.delphipraxis.net/201856-assign-fuer-tdictionary-implementieren.html)

DCoderHH 4. Sep 2019 12:22

AW: Assign für TDictionary implementieren
 
Zitat:

Zitat von Stevie (Beitrag 1444662)
oder den generischen parameter umnennen, ich hab das mal so gelöst gehabt: map<tkey,t>

Danke, so mache ich es.

Zitat:

Zitat von Stevie (Beitrag 1444662)
Übrigens die Schleife über die Keys und dann das Lookup jedes Wertes ist denkbar inperformant. Dann doch lieber direkt mit einer TPair<TKey,TValue> variable per for in über das Dictionary.

Hast Du ein kurzes Beisipel dafür?

Uwe Raabe 4. Sep 2019 12:30

AW: Assign für TDictionary implementieren
 
Zitat:

Zitat von bernau (Beitrag 1444659)
Dann dürfte in der Ableitung aber kein Inherited aufgerufen werden, da ja sofort AssignError ins Spiel kommt.

Das gilt aber auch für jeden Abkömmling von TPersistent. Allerdings bietet die Assign-Implementierung von TPersistent eine Art Fallback auf AssignTo, bei dem Source die Arbeit überlässt. Das ist in der obigen TMyDictionary-Implementierung nicht vorgesehen.

TiGü 4. Sep 2019 13:12

AW: Assign für TDictionary implementieren
 
Zitat:

Zitat von DCoderHH (Beitrag 1444663)
Zitat:

Zitat von Stevie (Beitrag 1444662)
oder den generischen parameter umnennen, ich hab das mal so gelöst gehabt: map<tkey,t>

Danke, so mache ich es.

Zitat:

Zitat von Stevie (Beitrag 1444662)
Übrigens die Schleife über die Keys und dann das Lookup jedes Wertes ist denkbar inperformant. Dann doch lieber direkt mit einer TPair<TKey,TValue> variable per for in über das Dictionary.

Hast Du ein kurzes Beisipel dafür?

Delphi-Quellcode:
type
  TMyDictionary<TKey, T> = class(TDictionary<TKey, T>)
  public
    procedure Assign(Source: TObject); virtual;
  end;


procedure TMyDictionary<TKey, T>.Assign(Source: TObject);
var
  LPair: TPair<TKey, T>;
  LSourceDictionary: TMyDictionary<TKey, T>;
begin
  if Source is TMyDictionary<TKey, T> then
  begin
    Self.Clear // ohne Clear -> kein richtiges Assign
    LSourceDictionary := TMyDictionary<TKey, T>(Source);
    for LPair in LSourceDictionary do
    begin
      Self.Add(LPair.Key, LPair.Value);
    end;
  end
end;

Stevie 4. Sep 2019 13:14

AW: Assign für TDictionary implementieren
 
Übrigens fehlt da wohl noch ein Self.Clear, sonst isses kein Assign sondern ein Hinzufügen - und dann braucht es auch kein AddOrSetValue sondern ein Add genügt, denn es können keine Keys schon existieren.

bernau 4. Sep 2019 13:24

AW: Assign für TDictionary implementieren
 
Zitat:

Zitat von Schokohase (Beitrag 1444660)
klar, nicht einfach blind aufrufen, aber durchaus konditional aufrufbar

Das stimmt natürlich.

TiGü 4. Sep 2019 13:57

AW: Assign für TDictionary implementieren
 
Zitat:

Zitat von Stevie (Beitrag 1444672)
Übrigens fehlt da wohl noch ein Self.Clear, sonst isses kein Assign sondern ein Hinzufügen - und dann braucht es auch kein AddOrSetValue sondern ein Add genügt, denn es können keine Keys schon existieren.

Stimmt, guter Hintweis.
So ist es nur eine Art Append anstatt Assign.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz