只说大家平时关注得比较少的
var mm: TDictionary<string, TObject>; acompare: IEqualityComparer<string>; pp:TPair<string,TObject>; begin acompare := TEqualityComparer<string>.Construct( function(const Left, Right: string):Boolean begin result := UpperCase(Left) = UpperCase(Right); end, function(const Value:string):Integer begin Result:=Length(Value); end); mm:=TDictionary<string, TObject>.Create(acompare); mm.Add('abc',TObject(PChar('中国'))); mm.AddOrSetValue('Abc',TObject(PChar('beijing'))); for pp in mm do ShowMessage(pp.Key+':'+PChar(pp.Value)); end;
上面的代码中,有一个比较类TEqualityComparer,用来判断新加的一组key.value中的key是不是存在。
Construct中的第一个函数就不说了,说第二个函数,这个函数大家可能都只是照着用,但是不清楚为什么这么用。
帮助文档中是这么说的:Generate a hash code. Simply return the length of the string as its hash code.
字典是以hash表的方式存储数据的,有了hash值,可以更快地定位所要的数据,以上面的代码为例,其hash存储的格式应该是这样的:
1 a:value b:value c:value
2 aa:value bb:value cc:value
....
其中a,b,c,aa,bb,cc就是key,而前面的1、2则是hash值,用length生成,如length(a) = 1,length(aa) = 2 , length(ab) = 2....
通过key的hash值,能快速定位到1、2...,然后再找到对应的key和value。