文档章节

详测 Generics Collections TDictionary(5): 多种 Create 手段

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 574
阅读 8
收藏 0
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.

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2009/10/11/1581068.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
Delphi 2010 中的泛型

Delphi 2010 中的泛型日期:2010年5月31日 作者: 人气:10504 查看:[大字体 中字体 小字体]2010已发布很长时间了,口碑还不错,准备用它开发下一项目,但对泛型等新东西的认识还不够,就搜了...

vga
2016/08/09
19
0
GBin1推荐教程之Java泛类型(Generics)快速入门

发布时间: 2011-9-20 来源:javacodegeeks.com 翻译: gbin1.com 泛类型(Generics)是Java SE5.0里的特性,在发布后的几年里,我相信每个java开发者都不仅仅听说过,而且实实在在的使用过。...

gbin1
2011/09/21
191
0
理解 RESTful WebService

RESTful 服务遵循REST(Representational State Transfer)的架构风格,中文翻译为:表现层状态转化 对于所有的CRUD(Read/Create/Update/Delete),RESTFul架构基于HTTP的简单动作(GET,POST,PU...

huojiao2006
2017/02/27
0
0
Apache Maven 3.0.3 Released

相比较 Maven 3.0.2 版本,3.0.3 改进主要包括: * [MNG-3575] - Allow hexadecimal parameters * [MNG-4971] - Display maven home in version info * [MNG-4984] - Simplify drop in of 3......

红薯
2011/03/05
1K
0
The Go Type System

Recently I've become very interested inthe Golang programming language. Golang, or Google Go as it's often called, is a new programming language designed by some fairly well-kno......

Jerikc
2014/08/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文 :分享Roy Orbison的单曲《She's a Mystery to Me》 《She's a Mystery to Me》- Roy Orbison 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
56
4
Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
12
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
20
0

中国龙-扬科
昨天
4
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部