使用 Delphi Xe 的 TDictionary

原本一直使用 TList, 将定义的一个个 Record 保存在TList 里面, 为了能把某些对象管理起来, 例如一个类的 n 多实例,可以进行索引、查找、释放等

今天刚看到原来已经有了一个叫 TDictionary 对象,用起来挺方便。 挺像我们在DB中定义的 Dictionary 表,Key、Value。  而那个不管Key、Value 都挺发达,允许各种定义的类。

ok,下面官方Demo很通俗易懂,各方法都在:

type
  TCity = class
    Country: String;
    Latitude: Double;
    Longitude: Double;
  end;
 
const
  EPSILON = 0.0000001;
 
var
  Dictionary: TDictionary<String, TCity>;
  City, Value: TCity;
  Key: String;
 
begin
  { Create the dictionary. }
  Dictionary := TDictionary<String, TCity>.Create;
  City := TCity.Create;
  { Add some key-value pairs to the dictionary. }
  City.Country := ‘Romania‘;
  City.Latitude := 47.16;
  City.Longitude := 27.58;
  Dictionary.Add(‘Iasi‘, City);
 
  City := TCity.Create;
  City.Country := ‘United Kingdom‘;
  City.Latitude := 51.5;
  City.Longitude := -0.17;
  Dictionary.Add(‘London‘, City);
 
  City := TCity.Create;
  City.Country := ‘Argentina‘;
  { Notice the wrong coordinates }
  City.Latitude := 0;
  City.Longitude := 0;
  Dictionary.Add(‘Buenos Aires‘, City);
 
  { Display the current number of key-value entries. }
  writeln(‘Number of pairs in the dictionary: ‘ +
  IntToStr(Dictionary.Count));
 
  // Try looking up "Iasi".
  if (Dictionary.TryGetValue(‘Iasi‘, City) = True) then
  begin
    writeln(
    ‘Iasi is located in ‘ + City.Country +
    ‘ with latitude = ‘ + FloatToStrF(City.Latitude, ffFixed, 4, 2) +
    ‘ and longitude = ‘ + FloatToStrF(City.Longitude, ffFixed, 4, 2)
    );
  end
  else
    writeln(‘Could not find Iasi in the dictionary‘);
 
  { Remove the "Iasi" key from dictionary. }
  Dictionary.Remove(‘Iasi‘);
 
  { Make sure the dictionary‘s capacity is set to the number of entries. }
  Dictionary.TrimExcess;
 
  { Test if "Iasi" is a key in the dictionary. }
  if Dictionary.ContainsKey(‘Iasi‘) then
    writeln(‘The key "Iasi" is in the dictionary.‘)
  else
    writeln(‘The key "Iasi" is not in the dictionary.‘);
 
  { Test how (United Kingdom, 51.5, -0.17) is a value in the dictionary but
    ContainsValue returns False if passed a different instance of TCity with the
    same data, as different instances have different references. }
  if Dictionary.ContainsKey(‘London‘) then
  begin
    Dictionary.TryGetValue(‘London‘, City);
    if (City.Country = ‘United Kingdom‘) and (CompareValue(City.Latitude, 51.5, EPSILON) = EqualsValue) and (CompareValue(City.Longitude, -0.17, EPSILON) = EqualsValue) then
      writeln(‘The value (United Kingdom, 51.5, -0.17) is in the dictionary.‘)
    else
      writeln(‘Error: The value (United Kingdom, 51.5, -0.17) is not in the dictionary.‘);
    City := TCity.Create;
    City.Country := ‘United Kingdom‘;
    City.Latitude := 51.5;
    City.Longitude := -0.17;
    if Dictionary.ContainsValue(City) then
      writeln(‘Error: A new instance of TCity with values (United Kingdom, 51.5, -0.17) matches an existing instance in the dictionary.‘)
    else
      writeln(‘A new instance of TCity with values (United Kingdom, 51.5, -0.17) does not match any existing instance in the dictionary.‘);
    City.Free;
  end
  else
    writeln(‘Error: The key "London" is not in the dictionary.‘);
 
  { Update the coordinates to the correct ones. }
  City := TCity.Create;
  City.Country := ‘Argentina‘;
  City.Latitude := -34.6;
  City.Longitude := -58.45;
  Dictionary.AddOrSetValue(‘Buenos Aires‘, City);
 
  { Generate the exception "Duplicates not allowed". }
  try
    Dictionary.Add(‘Buenos Aires‘, City);
  except
    on Exception do
      writeln(‘Could not add entry. Duplicates are not allowed.‘);
  end;
 
  { Display all countries. }
  writeln(‘All countries:‘);
  for Value in Dictionary.Values do
    writeln(Value.Country);
 
  { Iterate through all keys in the dictionary and display their coordinates. }
  writeln(‘All cities and their coordinates:‘);
  for Key in Dictionary.Keys do
  begin
    writeln(Key + ‘: ‘ + FloatToStrF(Dictionary.Items[Key].Latitude, ffFixed, 4, 2) + ‘, ‘ +
    FloatToStrF(Dictionary.Items[Key].Longitude, ffFixed, 4, 2));
  end;
 
  { Clear all entries in the dictionary. }
  Dictionary.Clear;
 
  { There should be no entries at this point. }
  writeln(‘Number of key-value pairs in the dictionary after cleaning: ‘ + IntToStr(Dictionary.Count));
 
  { Free the memory allocated for the dictionary. }
  Dictionary.Free;
  City.Free;
  readln;
end.
时间: 2024-10-11 01:47:11

使用 Delphi Xe 的 TDictionary的相关文章

[转]:Delphi XE中泛型数组的使用范例

Delphi XE中泛型数组的使用范例,下面的范例简单的使用了泛型字符串数组,如用 TArray 代替 array of Word, 还可以使用 TArray 类提供的算法(就是少了点). uses Generics.Collections, Generics.Defaults; {测试 TArray 的 Sort 方法} procedure TForm1.Button1Click(Sender: TObject); var arr: TArray<string>; //同 array of

Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决(对三层的例子配置有帮助)

Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLStoredProc.TSQLTable.TsqlServerMethod.TSQLMonitor.TSimpleDataSet).但是因为该组件只提供了各种数据库的抽象驱动,没有提供底层的与数据库直接交互的驱动库,因此,要想使用具体某种数据库,还需要搭配提供商驱动.本文以Delphi XE在Window

Delphi XE中类成员的访问权限(新增了strict private和strict protected,还有automated)

Delphi XE中类成员的访问权限共提供了6个关键词来用于限定访问权限:public.private.protected.published.automated strict private . strict protected其各自的含义为: 1. strict private:此区定义的字段或方法只能用于当前的类中.即T1中此区定义的成员只能在T1中使用.2. strict protected:此区定义的成员除能用于当前类中,还可用于当前类的任何子类中. 以上两种成员,同一个类的不同对象间

gzip, deflate delphi xe 2 解码 成功 哈哈

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 http://bbs.csdn.net/topics/190020986 function CFFunc.Compression.Zlib.DeCompressionStream(const AInStream,   AOutStream: TStream) : Boolean; var   ds : TDeCompressionStream;   buff : array[

Delphi XE Starter Essentials 中文目录

Table of Contents1. Delphi XE Starter IDE 1Delphi and C++Builder ....................................................................... 1 2007版的时候,IDE称为RAD Studio,并包括一个Delphi for .NET个性. 2009版的时候,Delphi for .NET被Delphi Prism for .NET代替,IDE保留了 Delphi

[转载]: delphi中XLSReadWrite控件的使用(2)---delphi XE下安装

一.下载 官方下载网址: http://www.axolot.com/components/download.htm 从这里可以下载到从Delphi5到DelphiXE全部支持的版本. 二.软件安装 下载下来的文件是exe格式,可以直接安装,一路next即可. 按照默认安装,会在: C:\Documents and Settings\All Users\Documents\RAD Studio\8.0  路径下生成XLSRWII4_D2011.bpl,安装时需要使用. C:\Program Fi

delphi XE Berlin ReadProcessMemory WriteProcessMemory

delphi  XE,Berlin [dcc32 Error] Unit9.pas(93): E2033 Types of actual and formal var parameters must be identical function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer; nSize: SIZE_T; var lpNumberOfBytesRead: SI

Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决

Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLStoredProc.TSQLTable.TsqlServerMethod.TSQLMonitor.TSimpleDataSet).但是因为该组件只提供了各种数据库的抽象驱动,没有提供底层的与数据库直接交互的驱动库,因此,要想使用具体某种数据库,还需要搭配提供商驱动.本文以Delphi XE在Window

Delphi XE程序设计系列 2-开发DataSnap/REST服务器

转载于:http://blog.csdn.net/shuaihj/article/details/6129271 Delphi XE程序设计系列 2-开发DataSnap/REST服务器 分类:            编程语言-Delphi2011-01-11 15:524122人阅读评论(1)收藏举报 delphi服务器restjavascriptfunction 在上次的文章中讨论了如何把传统的Delphi 主从架构应用程序逐渐转换为DataSnap JSON服务器,在本篇文章中让我们正式讨