电竞比分网-中国电竞赛事及体育赛事平台

分享

詳測 Generics Collections TDictionary(5): 多種 Cr...

 aaie_ 2014-01-18
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. 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多