gpt4 book ai didi

delphi 使用记录作为 TDictionary 中的键

转载 作者:行者123 更新时间:2023-12-03 14:37:01 35 4
gpt4 key购买 nike

可以使用记录作为 TDictionary 中的键值吗?我想根据字符串、整数和整数的组合来查找对象。

TUserParKey=record
App:string;
ID:integer;
Nr:integer;
end;

...

var
tmpKey:TUserParKey;
tmpObject:TObject;
begin
tmpObject:= TTObject.Create(1);
tmpKey.App:='1';
tmpKey.ID :=1;
tmpKey.Nr :=1;

DTUserPars.Add(tmpKey,tmpObject)

...

var
tmpKey:TUserParKey;
begin
tmpKey.App:='1';
tmpKey.ID :=1;
tmpKey.Nr :=1;

if not DTUserPars.TryGetValue(tmpKey,Result) then begin
result := TTObject.Create(2);
end;

这将返回对象 2。

最佳答案

是的,您可以使用记录作为 TDictionary 中的键,但您应该在创建字典时提供自己的 IEqualityComparer,因为记录的默认值仅对记录进行愚蠢的二进制比较。对于包含字符串的记录,此操作会失败,因为它只是比较该字符串的指针,即使该字符串包含相同的值,该指针也可能不同。

这样的比较器看起来像这样:

type
TUserParKeyComparer = class(TEqualityComparer<TUserParKey>)
function Equals(const Left, Right: TUserParKey): Boolean; override;
function GetHashCode(const Value: TUserParKey): Integer; override;
end;

function TUserParKeyComparer.Equals(const Left, Right: TUserParKey): Boolean;
begin
Result := (Left.App = Right.App) and (Left.ID = Right.ID) and (Left.Nr = Right.Nr);
end;

function TUserParKeyComparer.GetHashCode(const Value: TUserParKey): Integer;
begin
Result := BobJenkinsHash(PChar(Value.App)^, Length(Value.App) * SizeOf(Char), 0);
Result := BobJenkinsHash(Value.ID, SizeOf(Integer), Result);
Result := BobJenkinsHash(Value.Nr, SizeOf(Integer), Result);
end;

关于delphi 使用记录作为 TDictionary 中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27820171/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com