• 二十九、详测 Generics Collections TDictionary(5): 多种 Create 手段


    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 可以指定元素数, 这样可以提前分配空间以加快速度
    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 参数, 用于判断 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); {我暂时不知道这个函数的作用, 随便写的}
         
    end
      );
      
      Dictionary :
    = TDictionary<string,Integer>.Create(EqualityComparer);

      Dictionary.Add(
    'n1'111);
      Dictionary.Add(
    'n2'222);
      Dictionary.Add(
    'n3'333);

      
    {如果不是如上建立, 下面这句将会产生一个新元素, 而不是更新 n1 的值}
      Dictionary.AddOrSetValue(
    'N1'123); 
      ShowMessage(IntToStr(Dictionary[
    'n1'])); {123}
        
      Dictionary.Free;
    end;

    //Create 可以同时指定上面两个参数
    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}

      
    {指定元素数后, 用不了的可以释放}
      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.
  • 相关阅读:
    python基础一 day40 守护线程
    python基础一 day40 线程复习
    python基础一 day39 线程探索
    python基础一 day39 复习-回调函数
    python基础一 day38 进程池代码
    python基础一 day38 进程间的数据共享
    python基础一 day38 管道
    python基础一 day18 认识正则表达式及探索
    python小白-day3 函数
    python小白-day3 深浅拷贝
  • 原文地址:https://www.cnblogs.com/jxgxy/p/1600937.html
Copyright © 2020-2023  润新知