文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 574
阅读 8
收藏 0
点赞 0
评论 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
博文 2004
码字总数 14107
作品 0
深圳
程序员
Delphi 2010 中的泛型

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

vga ⋅ 2016/08/09 ⋅ 0

理解 RESTful WebService

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

huojiao2006 ⋅ 2017/02/27 ⋅ 0

GBin1推荐教程之Java泛类型(Generics)快速入门

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

gbin1 ⋅ 2011/09/21 ⋅ 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

java范型中的get、put原则

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

Beaver_ ⋅ 2015/05/24 ⋅ 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 ⋅ 0

C#中List用法

How to find objects in Generics with List.Find() method I've been looking for help on how to find objects in Generics with List.Find() method .... and ... take a look what I hav......

Yong_Luo ⋅ 2010/12/06 ⋅ 0

Mono AOT 参数

在多泛型及接口时使用Mono AOT需要使用如下编译 mscorlib.dll mono --aot=full,nrgctx-trampolines=8096,nimt-trampolines=8096,ntrampolines=4048 mscorlib.dll http://docs.xamarin.com/gu......

iBoxDB ⋅ 2014/04/27 ⋅ 0

Java泛型简明解释

Java泛型由来的动机 理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: List<Apple> apples=...Apple apple=apples.get(1); 如上的代码,就不用...

wisely ⋅ 2015/04/16 ⋅ 0

BeanUtils 1.9.0 发布, JavaBean 工具包

BeanUtils 1.9.0 版本包括一些bug修复和改进。最明显的改进是新版本现在要求 JDK5.0 版本以上,语言特性引入了Java 5(主要是泛型),同时还支持自定义 bean introspection。 修复的bugs ==...

唐伟 ⋅ 2013/12/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Thrift RPC实战(二) Thrift 网络服务模型

TServer类层次体系 TSimpleServer/TThreadPoolServer是阻塞服务模型 TNonblockingServer/THsHaServer/TThreadedSelectotServer是非阻塞服务模型(NIO) 1 TServer抽象类的定义 内部静态类Args的...

lemonLove ⋅ 12分钟前 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 13分钟前 ⋅ 0

MyBatis源码解读之配置

1. 目的 本文主要介绍MyBatis配置文件解析,通过源码解读mybatis-config.xml(官方默认命名)、Mapper.xml 与Java对象的映射。 2. MyBatis结构 查看大图 MyBatis结构图,原图实在太模糊了,所以...

无忌 ⋅ 17分钟前 ⋅ 0

Ignite的jdbc与网格的连接方式的查询性能对比

环境: 数据量100万 Ignite2.5 Windows10 8g jdbc方式连接 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; i......

仔仔1993 ⋅ 32分钟前 ⋅ 0

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 47分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 54分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 今天 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 今天 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 今天 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部