使用 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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值