文档章节

详测 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
180
0
理解 RESTful WebService

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

huojiao2006
2017/02/27
0
0
java范型中的get、put原则

java范型中的get、put原则 只要有可能,一个好的习惯就是插入通配符(wildcards ),但是如何决定选择哪种通配符呢?即什么场景选择extends,什么场景选择super,以及什么场景不适合选择通配...

Beaver_
2015/05/24
565
1
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 3rd p......

红薯
2011/03/05
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

VS code编辑器安装 php7.2 NTS 版本 Xdebug

本文使用的是 phpstudy 一键安装包(windows32位) php 版本是 php7.2 NTS 1、在 phpstudy 面板中开启 phpdebug 扩展 // 其他选项菜单-> php 扩展与设置-> php 扩展 2、官方下载 Xdebug // ...

削个椰子皮_给个梨
24分钟前
1
0
Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题

现在用Swagger来生成API文档的例子已经非常多了,今天碰到开发同事问了一个问题,帮着看了一下,主要还是配置方法的问题,所以记录一下。如果您也碰到了同样的问题,希望本文对您有用。 问题...

程序猿DD
54分钟前
3
0
sql 命令

show variables like '%general%'; show variables like '%log_output%'; show variables like '%quer%'; show global status like '%slow%';...

JavaSon712
今天
4
0
Django修改默认数据库引擎

Django默认数据库引擎为sqlite3,除了sqlite3,还支持postgresql、mysql、oracle 配置如下:其中postgresql_psycopg2为postgresql的适配器。 'django.db.backends.postgresql' 'django.db.bac......

MichaelShu
今天
0
0
动画源码解析

目录介绍 1.Animation和Animator区别 2.Animation运行原理和源码分析 2.1 基本属性介绍 2.2 如何计算动画数据 2.3 什么是动画更新函数 2.4 动画数据如何存储 2.5 Animation的调用 3.Animator...

潇湘剑雨
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部