unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Generics.Collections, Generics.Defaults;
//Create 可以指定元素數(shù), 這樣可以提前分配空間以加快速度
procedure TForm1.Button1Click(Sender: TObject);
var
Dictionary: TDictionary<string,Integer>;
begin
Dictionary := TDictionary<string,Integer>.Create(3);
Dictionary.Add('n1', 111);
Dictionary.Add('n2', 222);
Dictionary.Add('n3', 333);
Dictionary.Free;
end;
//Create 可以有一個 IEqualityComparer 參數(shù), 用于判斷 Key 怎樣才是相同
procedure TForm1.Button2Click(Sender: TObject);
var
Dictionary: TDictionary<string,Integer>;
EqualityComparer: IEqualityComparer<string>; {相等對比器}
begin
{通過 IEqualityComparer 讓 TDictionary 的 Key 忽略大小寫}
EqualityComparer := TEqualityComparer<string>.Construct(
function(const Left, Right: string): Boolean begin
Result := LowerCase(Left) = LowerCase(Right);
end,
function(const Value: string): Integer begin
Result := StrToIntDef(Value, 0); {我暫時不知道這個函數(shù)的作用, 隨便寫的}
end
);
Dictionary := TDictionary<string,Integer>.Create(EqualityComparer);
Dictionary.Add('n1', 111);
Dictionary.Add('n2', 222);
Dictionary.Add('n3', 333);
{如果不是如上建立, 下面這句將會產(chǎn)生一個新元素, 而不是更新 n1 的值}
Dictionary.AddOrSetValue('N1', 123);
ShowMessage(IntToStr(Dictionary['n1'])); {123}
Dictionary.Free;
end;
//Create 可以同時指定上面兩個參數(shù)
procedure TForm1.Button3Click(Sender: TObject);
var
Dictionary: TDictionary<string,Integer>;
EqualityComparer: IEqualityComparer<string>;
begin
EqualityComparer := TEqualityComparer<string>.Construct(
function(const Left, Right: string): Boolean begin
Result := LowerCase(Left) = LowerCase(Right);
end,
function(const Value: string): Integer begin
Result := StrToIntDef(Value, 0);
end
);
Dictionary := TDictionary<string,Integer>.Create(9, EqualityComparer);
Dictionary.Add('n1', 111);
Dictionary.AddOrSetValue('N1', 123);
ShowMessage(IntToStr(Dictionary['n1'])); {123}
{指定元素數(shù)后, 用不了的可以釋放}
Dictionary.TrimExcess;
Dictionary.Free;
end;
//可通過另一個 TDictionary 建立一個新的 TDictionary
procedure TForm1.Button4Click(Sender: TObject);
var
Dictionary, DictionaryTmp: TDictionary<string,Integer>;
pair: TPair<string,Integer>;
begin
DictionaryTmp := TDictionary<string,Integer>.Create();
DictionaryTmp.Add('n1', 111);
DictionaryTmp.Add('n2', 222);
DictionaryTmp.Add('n3', 333);
{通過另一個 TDictionary 建立}
Dictionary := TDictionary<string,Integer>.Create(DictionaryTmp);
{遍歷看看}
for pair in Dictionary do ShowMessage(IntToStr(Dictionary[pair.Key]));
{222 333 111}
DictionaryTmp.Free;
Dictionary.Free;
end;
//通過另一個 TDictionary 建立時, 可同時再指定 "相等對比器"
procedure TForm1.Button5Click(Sender: TObject);
var
Dictionary, DictionaryTmp: TDictionary<string,Integer>;
pair: TPair<string,Integer>;
EqualityComparer: IEqualityComparer<string>;
begin
DictionaryTmp := TDictionary<string,Integer>.Create();
DictionaryTmp.Add('n1', 111);
DictionaryTmp.Add('n2', 222);
DictionaryTmp.Add('n3', 333);
{再做個對比器}
EqualityComparer := TEqualityComparer<string>.Construct(
function(const Left, Right: string): Boolean begin
Result := LowerCase(Left) = LowerCase(Right);
end,
function(const Value: string): Integer begin
Result := StrToIntDef(Value, 0);
end
);
{通過另一個 TDictionary 建立, 同時更換對比器}
Dictionary := TDictionary<string,Integer>.Create(DictionaryTmp, EqualityComparer);
{測試對比器}
Dictionary.AddOrSetValue('N1', 999);
{遍歷看看}
for pair in Dictionary do ShowMessage(IntToStr(Dictionary[pair.Key]));
{222 333 999}
DictionaryTmp.Free;
Dictionary.Free;
end;
end.