Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TDictionary mit zusammengesetztem Schlüssel (https://www.delphipraxis.net/216146-tdictionary-mit-zusammengesetztem-schluessel.html)

TurboMagic 5. Nov 2024 19:39

TDictionary mit zusammengesetztem Schlüssel
 
Hallo,

irgendwo biege ich falsch ab...

Delphi-Quellcode:
type
  TStatisticsKey = record
    ProductID       : Integer;
    ConsumptionPlace : TConsumptionPlace;
  end;


function TStatisticsProductDict.IncSubID(ProductID        : Integer;
                                         ConsumptionPlace : TConsumptionPlace): Integer;
var
  Key : TStatisticsKey;
  Pair : TPair<TStatisticsKey, Integer>;
begin
  Key.ProductID       := ProductID;
  Key.ConsumptionPlace := ConsumptionPlace;

  if FItems.ContainsKey(Key) then
  begin
    Pair  := FItems.ExtractPair(Key);
    Result := Pair.Value + 1;

    FItems.Add(Key, Result);
  end
  else
  begin
    FItems.Add(Key, 0);
    Result := 0;
  end;
end;
FItems ist ein TDictionary<TStatisticsKey, Integer>
Das Problem ist jetzt, dass beim ersten Aufruf zwar ein Eintrag zu FItems hinzugefügt wird,
beim nächsten Aufruf mit genau der selben ProductID und Consumption Place findet ContainsKey
diesen nicht und fügt daher einen weiteren Eintrag mit dem Schlüssel hinzu.

Was mache ich falsch?

Olli73 5. Nov 2024 19:54

AW: TDictionary mit zusammengesetztem Schlüssel
 
Was ist denn TConsumptionPlace?

TurboMagic 5. Nov 2024 19:56

AW: TDictionary mit zusammengesetztem Schlüssel
 
Hallo,

das ist eine Enumeration, die 2 verschiedene Werte hat.

Uwe Raabe 5. Nov 2024 20:01

AW: TDictionary mit zusammengesetztem Schlüssel
 
Müsste es nicht
Delphi-Quellcode:
FItems.AddOrSet(Key, Result);
heißen?

Aber das ist nicht der Grund für das Key-Problem. Versuch mal ein
Delphi-Quellcode:
FillChar(Key, Sizeof(Key), 0);
bevor du die Record-Felder setzt.

Olli73 5. Nov 2024 20:05

AW: TDictionary mit zusammengesetztem Schlüssel
 
Eventuell brauchst du einen comparer, falls du noch keinen hast.

himitsu 5. Nov 2024 20:05

AW: TDictionary mit zusammengesetztem Schlüssel
 
Integer+Enum (also nichts mit Pointern) sollte problemlos mit dem Default-Comparer möglich sein,
aber ja, ein eigener Comparer kann hier auch helfen.

Zitat:

Zitat von Uwe Raabe (Beitrag 1542893)
Versuch mal

oder via
Delphi-Quellcode:
{$MinEnumSize 4}
den Enum vergrößern, damit es keine FillBytes gibt.
Oder
Delphi-Quellcode:
packed record
, aber vom Speicherzugriffstempo her, wäre es 0-gefüllt schneller.

TurboMagic 6. Nov 2024 17:08

AW: TDictionary mit zusammengesetztem Schlüssel
 
Halo,

packed record würde funktionieren.
Aber sehr wahrscheinlich entferne ich den ganzen Mechanismus weil mir
vermutlich eine noch einfachere Idee gekommen ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 Uhr.

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