TDictionary 泛型字典,类似哈希表.
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Edit1: TEdit; Edit2: TEdit; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses System.Generics.Collections; {定义一个泛型TDictionary类,指定由Cardinal,string构成} var Dictionary: TDictionary<Cardinal, string>; {建立} procedure TForm1.Button1Click(Sender: TObject); var Key: Cardinal; Value: string; str: string; k, v: Boolean; begin Key := StrToIntDef(Edit1.Text, 0); Value := Edit2.Text; if Value = '' then Value := 'Null'; k := Dictionary.ContainsKey(Key); {Key 是否存在} v := Dictionary.ContainsValue(Value); {Value是否存在} if not k then begin Dictionary.Add(Key, Value); Memo1.Lines.Add(Format('%d=%s', [Key, Value])); {同步显示} end; if k and not v then begin str := Format('key 已存在: %d=%s; 是否修改其值?', [Key, Dictionary[Key]]); if MessageBox(0, PChar(str), '提示', MB_OKCANCEL or MB_ICONQUESTION) = mrOk then begin Dictionary.AddOrSetValue(Key, Value); {也可使用上一句} Memo1.Lines.Values[IntToStr(Key)] := Value; {同步显示} end; end; if k and v then begin str := Format('%d=%s 已存在, 不能重复添加', [Key, Value]); MessageBox(0, PChar(str), '错误', MB_OK + MB_ICONHAND); end; Text := IntToStr(Dictionary.Count); end; {删除: Remove} procedure TForm1.Button2Click(Sender: TObject); var key: Integer; i: Integer; begin key := StrToIntDef(Edit1.Text, 0); if not Dictionary.ContainsKey(key) then begin ShowMessageFmt('key: %d 不存在', [key]); Exit; end; Dictionary.Remove(key); Text := IntToStr(Dictionary.Count); {同步显示} i := Memo1.Lines.IndexOfName(IntToStr(key)); if i > -1 then Memo1.Lines.Delete(i); end; {尝试取值: TryGetValue} procedure TForm1.Button3Click(Sender: TObject); var Key: Integer; Value: string; begin Key := StrToIntDef(Edit1.Text, 0); if Dictionary.TryGetValue(Key, Value) then ShowMessageFmt('key: %d 已存在, 其值是: %s', [Key, Value]) else ShowMessageFmt('key: %d 不存在', [Key]); end; {清空: Clear} procedure TForm1.Button4Click(Sender: TObject); begin Dictionary.Clear; Text := IntToStr(Dictionary.Count); Memo1.Clear; {同步显示} end; procedure TForm1.FormCreate(Sender: TObject); begin Dictionary := TDictionary<Cardinal, string>.Create; Memo1.Clear; Button1.Caption := Button1.Caption + ' 添加'; Button2.Caption := Button2.Caption + ' 删除'; Button3.Caption := Button3.Caption + ' 尝试取值'; Button4.Caption := Button4.Caption + ' 清空'; Edit1.Clear; Edit2.Clear; Edit1.NumbersOnly := True; end; procedure TForm1.FormDestroy(Sender: TObject); begin Dictionary.Free; end; end.