TDictionary gebruiken voor hashtabellen in Delphi

Geïntroduceerd in Delphi 2009, de TDictionary-klasse, gedefinieerd in de Generics. Collectieseenheid, vertegenwoordigt een generieke verzameling hashtabeltypen van sleutel / waarde-paren.

Generieke soorten, ook geïntroduceerd in Delphi 2009, kunt u klassen definiëren die niet specifiek het type gegevensleden definiëren.

Een woordenboek lijkt in zekere zin op een array. In een matrix je werkt met een reeks (verzameling) van waarden geïndexeerd door een geheel getal, dat kan elke zijn ordinale type waarde. Deze index heeft een onder- en bovengrens.

In een woordenboek kunt u sleutels en waarden opslaan waar elk van elk type kan zijn.

De TDictionary Constructor

Vandaar de verklaring van de TDictionary-constructor:

In Delphi wordt de TDictionary gedefinieerd als een hashtabel. Hash-tabellen vertegenwoordigen een verzameling sleutel-waardeparen die zijn georganiseerd op basis van de hash-code van de sleutel. Hash-tabellen zijn geoptimaliseerd voor zoekopdrachten (snelheid). Wanneer een sleutel / waarde-paar wordt toegevoegd aan een hashtabel, wordt de hash van de sleutel berekend en opgeslagen samen met het toegevoegde paar.

instagram viewer

De TKey en TValue kunnen van elk type zijn omdat ze generiek zijn. Als de informatie die u in het woordenboek wilt opslaan bijvoorbeeld uit een database komt, kan uw sleutel een GUID zijn (of een andere waarde die de unieke index) waarde weergeeft, terwijl de waarde een object kan zijn dat is toegewezen aan een rij gegevens in uw database tafels.

TDictionary gebruiken

Omwille van de eenvoud gebruikt het onderstaande voorbeeld gehele getallen voor TKeys en chars voor TValues.

Eerst verklaren we ons woordenboek door te specificeren wat de typen TKey en TValue zullen zijn:

Vervolgens wordt het woordenboek gevuld met de methode Toevoegen. Omdat een woordenboek niet twee paren met dezelfde sleutelwaarde kan hebben, kunt u de methode ContainsKey gebruiken om te controleren of een sleutelwaardepaar al in het woordenboek staat.

Gebruik de methode Verwijderen om een ​​paar uit het woordenboek te verwijderen. Deze methode veroorzaakt geen problemen als een paar met een opgegeven sleutel geen deel uitmaakt van het woordenboek.

Om alle paren te doorlopen door sleutels door te lussen, kun je een voor in lus.

Gebruik de TryGetValue-methode om te controleren of een sleutel / waarde-paar is opgenomen in het woordenboek.

Het woordenboek sorteren

Omdat een woordenboek een hashtabel is, worden items niet in een gedefinieerde sorteervolgorde opgeslagen. Profiteer van de TList - een generiek verzameltype dat sorteren ondersteunt om de sleutels te doorzoeken die zijn gesorteerd om aan uw specifieke behoefte te voldoen.

De bovenstaande code sorteert sleutels oplopend en aflopend en pakt waarden op alsof ze in de gesorteerde volgorde in het woordenboek zijn opgeslagen. De aflopende sortering van sleutelwaarden van het gehele type maakt gebruik van TComparer en een anonieme methode.

Wanneer sleutels en waarden van het type TObject zijn

Het bovenstaande voorbeeld is eenvoudig omdat zowel de sleutel als de waarde eenvoudige typen zijn. U kunt complexe woordenboeken hebben waarbij zowel de sleutel als de waarde "complexe" typen zijn, zoals records of objecten.

Hier is nog een voorbeeld:

Hier wordt een aangepast record gebruikt voor de sleutel en een aangepast object / klasse wordt gebruikt voor de waarde.

Let op het gebruik van een specialist TObjectDictionary klasse hier. TObjectDictionary kan de levensduur van objecten automatisch verwerken.

De waarde Key kan niet nul zijn, terwijl de waarde Value dat wel kan.

Wanneer een TObjectDictionary wordt geïnstantieerd, specificeert een Ownerships-parameter of het woordenboek eigenaar is van de sleutels, waarden of beide - en helpt u daarom geen geheugenlekken te hebben.

instagram story viewer