![]() |
TDictionary mit zusammengesetztem Schlüssel
Hallo,
irgendwo biege ich falsch ab...
Delphi-Quellcode:
FItems ist ein TDictionary<TStatisticsKey, Integer>
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; 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? |
AW: TDictionary mit zusammengesetztem Schlüssel
Was ist denn TConsumptionPlace?
|
AW: TDictionary mit zusammengesetztem Schlüssel
Hallo,
das ist eine Enumeration, die 2 verschiedene Werte hat. |
AW: TDictionary mit zusammengesetztem Schlüssel
Müsste es nicht
Delphi-Quellcode:
heißen?
FItems.AddOrSet(Key, Result);
Aber das ist nicht der Grund für das Key-Problem. Versuch mal ein
Delphi-Quellcode:
bevor du die Record-Felder setzt.
FillChar(Key, Sizeof(Key), 0);
|
AW: TDictionary mit zusammengesetztem Schlüssel
Eventuell brauchst du einen comparer, falls du noch keinen hast.
|
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:
Delphi-Quellcode:
den Enum vergrößern, damit es keine FillBytes gibt.
{$MinEnumSize 4}
Oder
Delphi-Quellcode:
, aber vom Speicherzugriffstempo her, wäre es 0-gefüllt schneller.
packed record
|
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