User:Nhollm
Todo: Exceptions Event Notification Dictionarys with Classes (TObjectDictionary)
Basic syntax
{$mode objfpc}
program Example;
uses
Generics.Collections; //import the generics-library of the RTL
type
TStringStringDictionary = specialize TDictionary<string, string>; //specialize a new dictionary and set the desired data-type of key and value
var
MyDictionary : TStringStringDictionary;
begin
MyDictionary := TStringStringDictionary.Create;
try
//do stuff with your dictionary..
finally
MyDictionary.Free;
end;
end.
Usage:
Add
Add Entry or update its current value (key, value)
MyDictionary.AddOrSetValue('Key1', 'Value1');
There is the Function Add. But AddOrSetValue is recommended. Add will throw an error if the Key already exists. 'Dublicate Not Allowed in Dictionary' and will not overwrite the value.
Remove
MyDictionary.Remove('Key2');
If the Key does not exist, no Error is thrown.
Clear
MyDictionary.Clear;
Get Value
WriteLn(MyDictionary.Items['Key1']);
If the provided key does not exist, this will throw an Error: 'Dictionary Key does not Exist'. You can use 'TryGetValue' instead.
Item Count
Total number of Items in dictionary (count)
WriteLn('Items in Dictionary: ' + IntToStr(MyDictionary.Count));
Loops
//Loop Keys
for KeyStr in MyDictionary.Keys do
WriteLn('Found key:' + KeyStr);
//Loop Values
for ValueStr in MyDictionary.Values do
WriteLn('Found Value: ' + ValueStr);
//Loop Key-Value-Pairs
//var KeyValuePair : TStringStringDictionary.TDictionaryPair;
for KeyValuePair in MyDictionary do
WriteLn('Found a Pair: Key:' + KeyValuePair.Key + ' Value:' + KeyValuePair.Value);
Check If Key/Value Exists
//Check if Key exists
if MyDictionary.ContainsKey('Key1') then
WriteLn('key exists')
else
WriteLn('key not found');
//Check if Value exists
if MyDictionary.ContainsValue("Searched value") then
writeln('value exists')
else
writeln('value not found');
Trying
If you want to get a feedback, then use these functions. They return a boolean.
True if sucessfull, False if not. No Error is thrown, so they are a good alternative to GetValue or Add.
TryAdd
TryAdd returns True if added successfully, False otherwise.
if MyDictionary.TryAdd('Key','TestValue') then
writeln('added successfully')
else
writeln('not sucessfull');
TryGetValue
TryGetValue takes two Arguments ->(key, value) and returns a boolean.
If found, it returns True and the provided 'value' variable becomes the value of the searched KeyValuePair.
If not found,the function returns False and the provided 'value'-variable is Nil (or whatever value the variable had before the function call).
if MyDictionary.TryGetValue('Key', SearchedValue) then
WriteLn('Key found. Its value is: ' + SearchedValue)
else
WriteLn('Could not get value');
//writeln(BoolToStr(MyDictionary.TryGetValue('Key', SearchedValue)));
Source Code
{$mode objfpc}
program Example;
uses
Generics.Collections //import the generics-library of the RTL
type
TStringStringDictionary = specialize TDictionary<string, string>; //specialize a new dictionary and set the data-type of key and value
var
MyDictionary : TStringStringDictionary;
TestClass : TmyCoolClass;
//
KeyString: string;
KeyValuePair : TStringStringDictionary.TDictionaryPair;
SearchedValue : string;
begin
//create the dictionary
MyDictionary := TStringStringDictionary.Create;
//Add Element or update its value to new (key, value)
MyDictionary.AddOrSetValue('Key1', 'Value1');
//Remove Element
MyDictionary.AddOrSetValue('Key2', 'Another Value');
MyDictionary.Remove('Key2');
//Clear entire dictionary
MyDictionary.Clear;
// Total number of Items in dictionary (count)
writeln('Items in Dictionary: ' + IntToStr(MyDictionary.Count));
//Get Value by Key
writeln(MyDictionary.Items['Key1'].Name); //If the provided key does not exist, this will throw a Error :'Dictionary Key does not Exist'
//----------------------Trying------------------
//TryAdd returns True if added successfully, False otherwise
writeln('TryAdd: ' + BoolToStr(MyDictionary.TryAdd('Key2',TestClass ),'True', 'False'));
//'TryGetValue'takes two Arguments ->(key, value) and returns a boolean.
//If found, it returns true and the provided 'value' variable becomes the value of the searched KeyValuePair
//if not found,the function returns False and the provided 'value'-variable is nil
writeln(BoolToStr(MyDictionary.TryGetValue('Key', SearchedValue)));
if MyDictionary.TryGetValue('Key', SearchedValue) then
writeln('Key found. Its Value is ' + SearchedValue.Name )
else
if SearchedValue = Nil then
writeln('the provided Value is Nil now');
//----------------------Loop through the Dictionary------------------
//Loop Keys
for KeyString in MyDictionary.Keys do
writeln('Found key:' + KeyString);
//Loop Values
for ValueStr in MyDictionary.Values do
writeln('Found Value:' + ValueStr);
//Loop Key-Value-Pairs
for KeyValuePair in MyDictionary do
writeln('Found a Pair: Key:' + KeyValuePair.Key + ' Value:' + KeyValuePair.Value.Name);
//----------------------Check if.. exists in whole Dictionary------------------
//Check if Key exists
if MyDictionary.ContainsKey('Key1') then
writeln('key exists')
else
writeln('key not found');
//Check if Value exists
if MyDictionary.ContainsValue(TestClass) then
writeln('value exists')
else
writeln('value not found');
readln() //for Windows-console-users
end.